[英]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.