0

一开始,我们构建了面向 5.0+ 的 iOS 应用程序,并使用 ARC 来简单地进行内存管理。后来为了向后兼容,我们决定支持 iOS 4.3。然后我只是

  1. 安装 iOS 4.3 模拟器
  2. 将应用部署目标修改为 4.3
  3. 清理、构建、运行

但是应用程序意外退出,输出如下

dyld:找不到符号:_objc_loadWeakRetained

引用自:/Users/xxx/Library/Application Support/iPhone Simulator/4.3.2/Applications/16E98912-33B5-4660-A9A3-879D92735E44/myApp.app/myApp

预期在:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation

我知道 4.3 不支持弱引用,但奇怪的是编译器在编译时从来没有抱怨过,它只是在运行时崩溃了。

更新:
我使用unsafe_unretained而不是弱关键字,该应用程序仍然运行。但是我收到了很多警告,例如

__NSAutoreleaseNoPool(): __NSArrayM 类的对象 0x564bd90 自动释放,没有适当的池 - 只是泄漏"* '

正常吗?如何消除这些警告?

4

1 回答 1

0

好吧,如果问题消失,看看您是否将部署目标更改回 5.1 会很有趣。我的猜测是不会。

我知道得到这种错误的唯一方法是:

1) 是创建一个并发 NSOperation,然后不为其提供运行循环/自动释放池 2) 不要在 main.m 中创建一个自动释放池 3) 使用一个对象创建一个 NSThread,然后尝试在该线程上向一个对象发送消息没有创建自动释放池

假设问题很可能是 3),您可以在过去的讨论中了解如何为线程创建池

于 2012-07-16T11:42:20.963 回答