1. ホーム
  2. iphone

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

2023-04-27 01:52:01

質問

私は Xcode 4.2 で最初の iOS アプリを開発し始め、iOS 5.0 をターゲットにして、quot;utility application" テンプレート (FlipsideViewController が付属しているもの) を使用していました。

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

FlipsideViewController.m: エラー。Automatic Reference Counting Issue: 現在のデプロイメントターゲットは自動化された __weak references をサポートしていません。

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

@synthesize delegate = _delegate;

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

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

弱参照がiOS 4でサポートされていないことは理解していますが、そもそもなぜ弱参照を使いたいのかがよくわかりませんし、ARCの利点を生かしつつ弱参照を使わないようにするにはどう書き直せばいいのかもわかりません(結局、iOS 4 AND 5で動くことになっているんですよね)。

どのように解決するのですか?

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

これはretain cyclesを避けるために行うのですが、これは私の回答でも触れています ここで . 元のオブジェクトへの強いポインタを持つ可能性のあるものへの強いポインタを持ちたくはないでしょう。 そうすると、何も適切にリリースされなくなります。