Xcode 4.2.1:使用ARC导致内存泄漏的NSThread

时间:2012-01-17 15:54:33

标签: ios multithreading memory-leaks automatic-ref-counting

我正在接近Xcode编程的学校项目的结束,但是现在我有一个小但非常烦人的问题:内存泄漏。泄漏已经追溯到以下代码行:

@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。再次感谢您的支持!

3 个答案:

答案 0 :(得分:2)

现在我只想用摇滚乐打自己。

我刚刚意识到“while”-loop永远不会停止。当然这意味着线程将继续运行,因此在应用程序完成之前,内存将不会被释放。

通过简单地添加一个在线程退出时设置为“NO”的布尔值,问题就解决了。大家:非常感谢你为我看这个问题。有时最大的问题是最小的解决方案......

答案 1 :(得分:1)

@autoreleasepool块在您的线程代码中(在这种情况下为updateThread),而不是创建线程。

答案 2 :(得分:1)

您没有在分离选择器的方法中创建自动释放池。每个线程选择器都需要自己的池。这样做:

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