簡體   English   中英

Xcode 4.2.1:使用ARC的NSThread導致內存泄漏

[英]Xcode 4.2.1: NSThread causing memory leak, using ARC

我正在用Xcode進行編程的學校項目快要結束了,但是現在我遇到了一個小而又很煩人的問題:內存泄漏。 該泄漏已追溯到以下代碼行:

@autoreleasepool {
    [NSThread detachNewThreadSelector:@selector(updateThread) toTarget:self withObject:nil];
}

當我對此進行評論時,泄漏消失了。 顯然autoreleasepool中出了點問題:我在這些方面還是有點新(特別是在使用ARC時),但是像這樣的線程使我清楚地知道使用@autoreleasepool應該足夠了。

由於某種原因,我的代碼不是這種情況。 我想我在這里遺漏了一些東西:如果有人可以就可能出現的問題給出一些想法,那么將不勝感激。 只需告訴我是否需要發布更多代碼,那將不是問題:出於問題可讀性的考慮,我嘗試將其限制為主要問題。

提前致謝!

編輯:

感謝您的第一反應! 但是,問題仍然存在。。。我將發布更多代碼來清除問題。 線程在viewDidLoad中啟動:

/*
 Everything mentioned here will be done after loading.
 */
- (void)viewDidLoad
{
    // Do standard setup
    [super viewDidLoad];

    // Do any additional setup before loading the view from its nib.
    self.title = @"Blog Manager";

    // Activate edit mode
    [tbvBlogList setEditing:YES animated:YES];
    tbvBlogList.allowsSelectionDuringEditing = YES;

    [NSThread detachNewThreadSelector:@selector(updateThread) toTarget:self withObject:nil];

    UIImage *btnImage = [UIImage imageNamed:@"iPhone_General_Button_Add_Blog.png"];
    UIButton *viewBtnAddBlog = [UIButton buttonWithType:UIButtonTypeCustom];
    [viewBtnAddBlog setImage:btnImage forState:UIControlStateNormal];
    viewBtnAddBlog.frame = CGRectMake(0, 0, 80, 36);
    [viewBtnAddBlog addTarget:self action:@selector(addBlogByButton:) forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *btnAddBlog = [[UIBarButtonItem alloc] initWithCustomView:viewBtnAddBlog];
    btnAddBlog.tintColor = [UIColor clearColor];
    self.navigationItem.rightBarButtonItem = btnAddBlog;
}

然后,用於線程化的其他函數:

/*
 Thread to update the progress bar with.
 */
- (void)updateThread
{
    @autoreleasepool {
        while(YES){
            [self performSelectorOnMainThread:@selector(updateProgressBar) withObject:nil waitUntilDone:false];
            [NSThread sleepForTimeInterval:0.1f];
        }
    }
}

/*
 Updates the progress bar.
 */
- (void)updateProgressBar
{
    pvProgress.progress = dProgress;
}

如果值得一提:我正在使用Xcode 4.2.1。 再次感謝支持!

現在,我只想砸石頭。

我只是意識到“ while”循環永遠不會停止。 當然,這意味着線程將繼續運行,因此直到應用程序完成后才釋放內存。

通過簡單地添加一個應該在線程退出時設置為“ NO”的布爾值,就解決了該問題。 大家:非常感謝您為我解決這個問題。 有時最大的問題是最小的解決方案...

@autoreleasepool塊位於您的線程代碼中(在本例中為updateThread ),而不是圍繞線程的創建。

您不是在分離的選擇器的方法中創建自動釋放池。 每個線程選擇器都需要自己的池。 這樣做:

- (void) updateThread
{
    @autoreleasepool {
        // former code here
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM