2011-07-31 9 views
87

私は最初のiOSアプリケーションをXcode 4.2で開発し始めました.IOS 5.0には "ユーティリティアプリケーション"テンプレート(FlipsideViewControllerに付属)を使用していました。ARCを使用してiOS 4.0をターゲットに設定する場合、弱参照を置き換えるにはどうすればよいですか?

ARCはコンパイル時の機能なので、iOS 4と互換性があるはずなので、私は自分のアプリを4.3に向けてコンパイルしようとしました。私がそうするとき、私はこのエラーを取得する:

FlipsideViewController.m:エラー:自動参照カウントの問題:

:現在のデプロイメント・ターゲットは、自動化された__weak参照

をサポートしていません。それは、この行を参照しています

@synthesize delegate = _delegate; 

変数は次のように宣言されていること:

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

私は理解して弱い参照」というs "はiOS 4ではサポートされていませんが、なぜ弱い参照を使用して始めたいのか理解できませんし、ARCを利用しながらも、使い方を書き直す方法を理解することはできません(結局のところ、iOS 4と5で正しく動作するはずです)

答えて

148

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

これは、保持サイクルを避けるために行います。回答はhereです。元のオブジェクトに戻って強いポインタを持つ可能性のあるものへの強力なポインタを持つことは望ましくありません。その後、何も適切に解放されませんでした。

+0

アドバイスをいただきありがとうございます。あなたは "古いOSをターゲットにする..."と言う。これは、5.0より古いアプリのビルドでのみunsafe_unretainedを使用する必要があることを意味しますか?または、自分のコードでunsafe_unretainedを使用して、4.xと5.xの両方をターゲットにしてビルドすることはできますか? –

+1

@Mason - 'unsafe_unretained'は、iOS 4.xと5.0の両方でサポートされているので、下位互換性があります。 5.0のみのビルドを行っていた場合は、追加の安全性を利用するために 'weak'に切り替えることができます。 –

+0

unsafe_unretainedを試しましたが、とにかく動作しました。しかし、私は '' __NSAutoreleaseNoPool()のような警告を受け取りました:クラス__NSArrayMのオブジェクト0x564bd90は、プールがない状態でオートリースされました - 単に "*"がリークしていました。 – fifth

11

追加の安全性のために弱い参照のみを使用する場合は、新しいランタイム関数が使用可能な場合は手動で呼び出し、そうでない場合は__unsafe_unretainedという単純な代入にフォールバックします。

ZWRCompatibility.hこれを多少簡略化します。

+0

ありがとう@rpetrich! –

10

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

これは設定が非常に簡単で、5.x以上の追加の考慮や労力を必要としません。

関連する問題