0

我有一个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;
}

良好的内存管理实践期望我们释放我们分配、复制或新的任何对象。但是,当我的线程完成时,如果我已释放(或自动释放)已添加到 my 的块UIScrollView,则对象会在 my 中显示UIScrollView一秒钟,然后消失。

我应该如何释放内存而不丢失这些对象?

4

1 回答 1

4

您绝不能addSubview:在后台线程上修改视图(调用)。这就是为什么你会出现奇怪的行为。您必须调用addSubview:主线程。

这种类型的工作通常使用 GCD 或NSOperationQueue. 在大多数情况下,手动NSThread效率较低,并且更难以正确编码。您可以addSubview:像这样将呼叫移动到主队列:

dispatch_async(dispatch_get_main_queue(), ^{
  [self.scrollView addSubview:block];
  [block release];
});

到这里的调用self是故意的。它创建了一个临时保留循环,以确保在此代码运行之前我们不会被释放。

将此项目切换到 ARC 将简化此处的内存管理,建议使用。

于 2013-02-14T19:57:11.087 回答