1

我刚刚花了一天时间追踪一个非常奇怪的错误。这是一个过度发布的 UILabel,尽管在代码中没有过度发布。如果我注释掉标签的发布,代码就可以了。

我将其追踪到正在后台线程中发布的 UIView。这似乎不正确,因为您应该从主线程访问所有 UI 元素。然后我找到了一个在后台线程中加载的 nib 文件:

[[NSBundle mainBundle] loadNibNamed:@"nib name" owner:self options:nil];

我不需要详细说明代码在做什么,但我的问题是:

如果在后台线程中调用 loadNibNamed 并且加载的视图被 nib 加载过程缓存,那么主线程也想要加载该 nib - 但从缓存中加载它。当我的对象被释放时 - 从背景中的笔尖加载的视图是否也在背景中释放..?? 真的没有意义,因为无论如何后台线程将不再存在....

我不知道,但我通过将 GCD 调度中的 loadNibNamed 部分代码同步包装到主线程来解决它。

4

2 回答 2

3

来自 Mike Ash 的文章

危险的可可呼叫

NSBundle 这个有 NSHost 的一半问题。NSBundle 返回共享对象,但不是线程安全的,所以它只是主线程。从主线程使用它仍然是安全的。我将其标记为危险的原因是因为从辅助线程使用它是不安全的事实并没有真正记录下来,而是必须从它不是线程安全的事实和实例是共享的事实来推断的,并且它可以很想从其他线程中使用它。

于 2012-03-13T00:05:24.173 回答
2

所有与 UI 相关的操作都应该在主线程中完成。

于 2012-02-13T17:23:38.440 回答