我只花了一天时间追踪一个非常奇怪的错误。这是一个UILabel被过度释放,虽然在代码中没有过度释放。如果我注释掉标签的发布,代码就没问题了。
我将它追溯到正在后台线程中发布的UIView。这似乎不对,因为您应该从主线程访问所有UI元素。然后我找到了一个使用以下命令在后台线程中加载的nib文件:
[[NSBundle mainBundle] loadNibNamed:@"nib name" owner:self options:nil];
我不需要详细了解代码的用途,但我的问题是:
如果在后台线程中调用loadNibNamed并且加载的视图由nib加载进程缓存,则主线程也想加载该nib - 但是从缓存加载它。当我的对象被释放时 - 从背景中的笔尖加载的视图也在后台发布了。??因为背景线程不再存在,所以没有意义......
我不知道,但我通过将GCD调度中的代码的loadNibNamed部分同步包装到主线程上来解决它。
答案 0 :(得分:3)
来自Mike Ash的文章
一个NSBundle 这个问题有一半是NSHost的问题。 NSBundle返回共享对象,但不是线程安全的,所以它只是主线程。从主线程使用它仍然是安全的。我将其标记为危险的原因是因为从辅助线程使用它是不安全的这一事实并没有真正记录,而是必须从它不是线程安全的事实和事实是共享的事实推断出来,它可以很想从其他线程中使用它。
答案 1 :(得分:2)
所有与UI相关的操作都应该从主线程完成。