32

ARCがコンパイル時のものであり、iOS 4との下位互換性があると最初に発表されて以来、私は読んだり聞いたりしました。Xcode4.2の自動リファクタリングを使用して、プロジェクトをARCに正常にリファクタリングしました。 iOS 5.0 SDK、正常に動作します。ただし、iOS 4.2 SDKに対してコンパイルしようとすると、リンク時に失敗し、次の記号が表示されません。

  • _objc_retainAutoreleaseReturnValue
  • _objc_autoreleaseReturnValue
  • _objc_storeStrong
  • _objc_retain
  • _objc_release
  • _objc_retainAutoreleasedReturnValue

チェックしたところ、これらのシンボルは5.0には存在しますが、4.2には存在しません。

iPhoneOS5.0.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$
00005ed0 T _objc_retain
000061d0 T _objc_retain

iPhoneOS4.2.sdk/usr/lib $ find . -type f|xargs nm|grep -i _objc_retain$
[... *crickets* ...]

これはAppleが嘘をついたことを意味しますか?代わりに、私は混乱して何か間違ったことをしていると思いますが、何がわからないのです。

これは、Xcode 4.2(ビルド4C199)のGMリリースによるものです。

4

2 に答える 2

34

ARCはiOS4.3以降でサポートされています。iOS 5.x SDKを使用する必要がありますが、展開ターゲットとしてiOS4.3を選択できます。4.xでサポートされていないことの1つは、自動弱参照ゼロ化です。

Objective-Cの機能可用性インデックスについては、こちらのAppleのドキュメントを参照してください。

Xcode4.4および4.5を使用してアプリを送信できます。

NSDictionaryおよびNSArrayの添え字はOSX10.6およびiOS4にデプロイされることに注意してください。また、デプロイメントターゲットも必ず元に戻してください。

于 2011-10-12T23:34:32.557 に答える
11

遅くなりましたが、重要なお知らせです。受け入れられた答えは正しいです。Apple は、iOS 4.0以降を ARC サポートの最小 OS として述べています。

ただし、いくつかの状況で壊れることがあります。それらの 1 つはもちろん__weakキーワードであり、派生語です。次のようなエラーが表示されます。

dyld: lazy symbol binding failed: Symbol not found: _objc_initWeak

2 番目の非常に危険な状態は+load、NSObject のメソッドを使用する場合です。iOS 4.x で ARC を使用してこれを行うと、見つけにくいランタイム クラッシュが発生します。次のような実行時エラーが発生した場合は、+loadメソッドを確認してください。私にとっては、その特定のファイルに -fno-objc-arc フラグを設定することでうまくいきました。

dyld: lazy symbol binding failed: Symbol not found: _objc_retainAutoreleasedReturnValue
于 2012-08-28T07:50:18.623 に答える