ARCを使用してiOS 4.0をターゲットとする場合、弱参照をどのように置き換えるのですか?


87

私はXcode 4.2を使用して最初のiOSアプリの開発を開始し、「ユーティリティアプリケーション」テンプレート(FlipsideViewControllerに付属するテンプレート)を使用してiOS 5.0をターゲットにしていました。

ARCはコンパイル時の機能なので、iOS 4とも互換性があるはずなので、アプリのターゲットを4.3にしてコンパイルしてみました。そうすると、次のエラーが発生します。

FlipsideViewController.m:エラー:自動参照カウントの問題:現在のデプロイメントターゲットは自動__weak参照をサポートしていません

それはこの行を参照しています:

@synthesize delegate = _delegate;

その変数は次のように宣言されます。

@property (weak, nonatomic) IBOutlet id <FlipsideViewControllerDelegate> delegate;

「弱い参照」がiOS 4でサポートされていないことは理解していますが、なぜ弱い参照を最初から使用したいのか、それを使用しないように書き直す方法がわからないのですが、まだARCを利用しています(結局のところ、iOS 4および5で動作するはずですよね?)

回答:


149

古いOSをターゲットにするunsafe_unretainedにはweak、プロパティ宣言の代わりにを使用できます。これはほとんど同じように動作するはずです。 weakターゲットがなくなると自分自身を参照しunsafe_unretainedますが、リンクを解除するときにリンク先のオブジェクトがぶら下がりポインタに変わる可能性はあります。後者は、あなたが使用した場合と同じ動作ですassign手動のメモリ管理でプロパティ宣言としてした。

これは、保持サイクルを回避するために行います。これについては、私の回答でここで触れます。元のオブジェクトへの強力なポインターがある可能性のあるものへの強力なポインターが必要ない場合。その後、何も適切に解放されません。


アドバイスありがとうございます。「古いOSをターゲットにする...」と言います。これは、5.0より古いアプリのビルドでのみunsafe_unretainedを使用する必要があることを意味しますか?または、コードでunsafe_unretainedを使用して、4.xと5.xの両方をターゲットとするようにビルドできますか?
メイソンG.ズウィティ2011

1
@Mason- unsafe_unretainediOS 4.xと5.0の両方でサポートされているため、下位互換性があります。5.0のみのビルドを行っていた場合weakは、それに追加された安全性を利用するように切り替えることができます。
ブラッド・ラーソン

私はunsafe_unretainedを試しましたが、とにかくうまくいきました。ただし、 '"** __NSAutoreleaseNoPool():クラス__NSArrayMのオブジェクト0x564bd90のような多くの警告が表示されましたが、プールがありません-リークしているだけです**'、それは正常ですか?
5

1
@ 5-それは全く無関係の問題です。自動解放プールを設定せずに、バックグラウンドスレッドで何かを実行しています。手動で作成されたスレッドには独自の自動解放プールがないため、使用して自分で作成する必要があります@autoreleasepool(ARCでは、手動で参照される古い実装のNSAutoreleasePoolを使用)。
ブラッドラーソン

@Brad、それは役に立ちました。警告は出ていません。performSelectorInBackgroundの呼び出しがいくつかありました。
第五

11

安全性を高めるために弱参照のみを使用する場合は、新しいランタイム関数が利用できる場合は手動で呼び出し、利用でき__unsafe_unretainedない場合は変数への単純な割り当てにフォールバックします。

ZWRCompatibility.hはこれを幾分単純化します。


10

Mike Ashの互換性ライブラリPLWeakCompatibiltyのおかげ、iOS 4.xでも__weakを簡単に使用できるようになりました。

設定は非常に簡単で、5.xを超える追加の考慮や労力は必要ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.