web-dev-qa-db-ja.com

ARCはiOS 4で本当にサポートされていますか? iOS 4.2 SDKには、リンク時にARC関連のシンボルがありません

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=嘘をついたという意味ですか?代わりに私は混乱して何か間違ったことをしていると思いますが、私は何を理解できません。

これはGM Xcode 4.2(Build 4C199)のリリースです。

32
Doug McBride

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

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

Xcode 4.4および4.5を使用してアプリを送信できます。

NSDictionaryとNSArrayの添え字は、OS X 10.6とiOS 4にデプロイされることに注意してください。デプロイメントターゲットも必ず設定してください。

34
zaph

少し遅れますが、これは重要な情報です。受け入れられた答えは正解です 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
11
Paul de Lange