【问题标题】:loading a nib on a background thread在后台线程上加载笔尖
【发布时间】:2012-02-13 17:16:11
【问题描述】:

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

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

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

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

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

我不知道,但是我通过将 GCD 调度中的 loadNibNamed 部分代码同步包装到主线程上来解决了这个问题。

【问题讨论】:

    标签: objective-c ios nib grand-central-dispatch loadnibnamed


    【解决方案1】:

    来自 Mike Ash 的文章

    Dangerous Cocoa Calls

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 是的,我在我的问题中引用了这一点。我的问题更多的是关于在其他线程中加载 nib 以及在线程之间共享缓存对象。
      猜你喜欢
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 2013-06-22
      • 2017-03-03
      相关资源
      最近更新 更多