86

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

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

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

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

@synthesize delegate = _delegate;

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

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

「弱い参照」はiOS4でサポートされていないことは理解していますが、最初に弱い参照を使用する理由がよくわかりません。また、使用を避けるためにどのように書き直すのかわかりません。まだARCを利用しています(結局のところ、iOS 4と5で動作するはずですよね?)

4

3 に答える 3

149

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

これは、保持サイクルを回避するために行います。これについては、ここでの回答で説明します。元のオブジェクトへの強力なポインターを持つ可能性のあるものへの強力なポインターは必要ありません。そうすると、何も適切にリリースされません。

于 2011-08-05T17:41:59.800 に答える
11

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

ZWRCompatibility.hは、これをいくらか単純化します。

于 2011-08-29T02:48:21.400 に答える
10

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

構成は非常に簡単で、5.xを超える追加の検討や労力は必要ありません。

于 2012-06-28T20:58:30.457 に答える