2012-01-17 69 views
0

我正在接近編程在Xcode的學校項目的結束,但現在我有一個小但非常惱人的問題:內存泄漏。泄漏已被追溯到下面的代碼行:Xcode 4.2.1:NSThread導致內存泄漏,使用ARC

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

當我評論這一點,泄漏消失了。顯然autoreleasepool出了問題:我對這些(特別是在使用ARC)方面還是有點新意,但像this one這樣的線程告訴我使用@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。再次感謝支持!

回答

2

現在我只想用一塊石頭打自己。

我剛剛意識到「while」-loop從不停止。當然這意味着線程將繼續運行,因此內存將永遠不會被釋放,直到應用程序結束。

當線程退出時,只需添加一個設置爲「NO」的布爾值,問題就解決了。大家:非常感謝你爲我解決這個問題。有時最大的問題有最小的解決方案...

+0

是的,正確的:)但你仍然可以榮幸我們的答案與1-1 upvote ... :) – 2012-01-18 16:57:02

+1

完成,你們當之無愧:) – Tybs 2012-01-21 13:47:24

+0

很酷,謝謝,並且很高興你終於做到了。 :) – 2012-01-21 14:02:22

1

@autoreleasepool塊進入你的線程代碼(updateThread在這種情況下),而不是圍繞線程的創建。

+0

感謝您的迴應:但我必須回答相同的H2CO3。很不好,這並沒有解決這個問題。我的問題已更新。 – Tybs 2012-01-18 11:58:53

1

您不是在分離選擇器的方法內創建一個autorelease池。每個線程選擇器都需要自己的池。像這樣:

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

謝謝:我只是試過這個,但它似乎沒有任何其他影響。我用更多的信息更新了這個問題。 – Tybs 2012-01-18 11:57:48