我有一个运行以下代码的 NSThread
:
for (Experiment *exp in experiments) {
ExperimentBlock *block = [[ExperimentBlock alloc] initWithFrame:CGRectMake(0, maxHeight, 310, 50)
experiment:exp
target:self
action:@selector(onExperimentButtonClicked:)];
[scrollView addSubview:block];
// block cannot be released for some inadequately explained reason
maxHeight += 60;
}
良好的内存管理实践要求我们释放任何已分配、复制或新建的对象。然而,当我的线程结束时,如果我已经释放(或自动释放)我添加到我的 UIScrollView
的 block ,对象会在我的 UIScrollView
中显示一秒钟消失。
我应该如何在不丢失这些对象的情况下释放内存?
最佳答案
您绝不能在后台线程上修改 View (调用 addSubview:
)。这就是为什么你会出现奇怪的行为。您必须在主线程上调用 addSubview:
。
这类工作通常使用 GCD 或 NSOperationQueue
可以做得更好。手动 NSThread
在大多数情况下效率较低,并且更难正确编码。您可以将 addSubview:
调用移动到主队列,如下所示:
dispatch_async(dispatch_get_main_queue(), ^{
[self.scrollView addSubview:block];
[block release];
});
这里对 self
的调用是有意的。它创建了一个临时保留循环,确保我们在这段代码运行之前不会被释放。
将此项目切换到 ARC 将简化此处的内存管理,这是推荐的做法。
关于ios - 分配的对象不能在单独线程的循环中释放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882828/