在后台线程中释放对象

时间:2012-01-31 03:59:37

标签: objective-c ios multithreading dealloc

我一直致力于iOS项目,后者在后台使用数据下载。好吧,说实话 - 实现并不是最好的(后来为了删除这种非显而易见的模式而被更改),我对未解除分配的对象有一些问题,并且不能说,文档给了我一个清晰的理解发生了什么事。代码,展示了共同的想法:

- (void)loadModelAtIndex:(NSUInteger)index {
    Model *model = [self modelAtIndex:index];
    if (model) {
        model.index = index;
        [self performSelectorInBackgroundThread:@selector(loadModelInBackgroundThread) withObject:model]
    }
}

- (void)loadModelInBackgroundThread:(Model *)model {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    model.data = [NSData dataWithContentsOfURL:model.url];
    //and some other changes can be here
    [self performSelectorOnMainThread:@selector(modelDidLoad) withObject:model waitUntilDone:NO]'
    [pool drain];
}

- (void)modelDidLoad:(Model *)model {
    [self saveModel:model atIndex:model.index];
    [self loadModelAtIndex:model.index + 1];
}

好吧,几乎所有时间它都按预期工作。除非在后台下载时调用者已被释放,否则模型对象会保留在内存中,而不会被释放(此时我的内存增长了。)

任何人都可以解释一下,在重新分配的情况下会发生什么,而后台线程正在运行?我不确定这段代码是否适用,但仍然感兴趣。任何修改都会让事情顺利进行?

1 个答案:

答案 0 :(得分:2)

  

除非在后台下载时调用者已被取消分配 - 模型对象保留在内存中

performSelector | …Thread…次调用保留了他们的参数。如果您的对象在那段时间被释放,问题就在于其他地方。在启用僵尸的情况下运行以找到它 - 您可以记录每个引用计数。