ios - 分配的对象不能在单独线程的循环中释放

标签 ios objective-c memory-management memory-leaks nsthread

我有一个运行以下代码的 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/

相关文章:

ios - 如何使用 AppleScript 删除 plist 键

ios - 按钮控件不响应 Swifty `Player` 包 View Controller 中的点击

ios - iOS8下CGAffineTransform Make Rotation和Auto Layout问题

ios - 更改窗口的 rootViewController 的内存管理

ios - 在 xcode 中禁用整个嵌套项目的 ARC

ios - 如何让 iPhone/iPad 网络应用程序保持全屏模式?

ios - 为 `UICollectionViewController` 带来一个 UIView 到前面

ios - 如何找到内存警告的真正原因以及如何在iOS应用程序中解决

ios - 非平凡循环中的 block

.net - 进行进程内存转储并稍后在 .NET 中恢复它