gpt4 book ai didi

objective-c - 在后台线程中释放对象

转载 作者:行者123 更新时间:2023-11-29 11:16:54 25 4
gpt4 key购买 nike

我一直在做 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];
}

好吧,几乎所有时间它都按预期工作。除非调用者在后台下载时被释放 - 模型对象保留在内存中,没有被释放(此时我的内存越来越大)。

谁能解释一下,在后台线程运行时释放内存会发生什么?我不确定这段代码是否合适,但仍然感兴趣。任何修改都会使事情运行良好?

最佳答案

Except if caller has beed deallocated while downloading in background - Model object stayed in memory

performSelector | …Thread… 调用保留它们的参数。如果您的对象在那个时候被释放,那么问题出在其他地方。在启用僵尸的情况下运行以定位它 - 您可以记录每个引用计数。

关于objective-c - 在后台线程中释放对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9074168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com