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 が弱い参照をサポートしていないことは知っていましたが、コンパイル時にコンパイラが文句を言わず、単に実行時にクラッシュしたのは奇妙です。

更新: weak キーワードの代わりにunsafe_unretained
を使用しましたが、アプリはとにかく実行されました。しかし、次のような警告がたくさんありました

__NSAutoreleaseNoPool(): クラス __NSArrayM のオブジェクト 0x564bd90 は、プールが配置されていない状態で自動解放されました - ただリークしています"* '

それは正常でしたか?これらの警告を取り除く方法は?

4

1 に答える 1

0

問題が解決したら、展開ターゲットを 5.1 に戻してみるのも興味深いでしょう。私の推測では、そうではありません。

この種のエラーが発生する唯一の方法は次のとおりです。

1) 並行 NSOperation を作成し、それに対して runloop/autorelease プールを提供しない 2) main.m に autorelease プールを作成しない 3) オブジェクトを使用して NSThread を作成し、そのスレッドでオブジェクトにメッセージを送ろうとする自動解放プールを作成せずに

問題が 3) である可能性が最も高いと仮定すると、この過去のディスカッションでスレッドのプールを作成する方法を見つけることができます。

于 2012-07-16T11:42:20.963 に答える