16

私は経験豊富な iOS 開発者であり、AppKit の開発に挑戦することにしました。私がAPIに関して行っているいくつかの調整がありますが、それ以外は、OS X開発は「慣れ親しんだ」ものであることがわかっています。

私は Interface Builder で AppKit UI を構築してきましたが、WYSIWYG エディターを使用してコード ファイルにプロパティを作成すると、Apple が以下を作成していることに気付きました。

@property (assign) IBOutlet NSTableView *tableView;

iOS でのデフォルトの方法では、これを行うようになったので、これは非常に興味深いと思います。

@property (nonatomic, retain) IBOutlet NSTableView *tableView;

Mac での開発では、ビューがアンロードされる可能性があり、UI 要素への強力な参照が必要になる可能性があるモバイルで行うのと同じメモリ制約がないことを認識しています。

AppKit の場合、ビュー階層をいじって親ビューから削除しない限り、UI 要素は常にそこにあると想定できます。ダングリング ポインターに意図せずにアクセスすることを防ぐために、常に強力な参照を保持することは賢明に思えます。

Apple が強力な参照ではなく、ここで弱い参照を作成するのはなぜですか?

強い参照を使用することで、意図しない結果に備えていますか (ただし、適切にリリースされていますdealloc)。ここに私が見逃しているパターンはありますか?

4

1 に答える 1

16

ファイルの所有者として、nib 内のすべてのトップレベル オブジェクトを所有する必要があります。親オブジェクトはその子オブジェクトを所有するため、通常、これらのオブジェクト内のオブジェクトを所有する必要はありません。たとえば、ウィンドウはそのビューを所有します。

AppKit の nib ローダーは、ファイルの所有者に代わってすべてのトップレベル オブジェクトを暗黙的に保持します。@property(これは、 、合成されたアクセサー、および ARC が存在する前に意味がありました。) したがって、関連するプロパティがweakorunsafe_unretained (後者は の同義語assign) であっても、所有者は実際には最上位オブジェクトを所有します。逆に、これらのプロパティstrong(aka retain) を作成すると、FO は各オブジェクトの2 つの所有権を持ちます: 暗黙の所有権とstrong-property 所有権です。

手動参照カウントを使用していると仮定すると、 で暗黙の所有権を解放できますがawakeFromNib、それはうまく機能しています。nib がロードされた後にこれらのオブジェクトを置き換えない限り (たとえば、テーブル ビューを別のテーブル ビューに交換するなど)、unsafe_unretained余分な保持や作業を行わなくても、プロパティは問題なく機能します。

unsafe_unretainedassignただし、理由により、その名前が付けられます (そして、その名前はオブジェクトのプロパティよりも優先されます)。ウィンドウとそのビューの例に戻って、ウィンドウを所有していて、そのビューの 1 つについて知っているとします。ビューのスーパービューはおそらくその唯一の所有者であるため、ウィンドウを閉じる (またはユーザーがウィンドウを閉じる) と、ビューは解放され、その結果割り当てが解除されます。ビューへのプロパティがunsafe_unretained/assignである場合、この現在死んでいるオブジェクトについてまだ知っているため、ビューにメッセージを送信しようとすると、クラッシュまたは例外が発生する可能性があります。

ARC に切り替えて、プロパティを として宣言する必要がありますweak。こうすることで、余分な所有権が作成されずnil、ビューが終了したときにプロパティが自動的に設定され、オーバーリリース クラッシュが発生するのを防ぎます。

(あなたがファイルの所有者でない場合、それはあなたには当てはまりません。おそらく、適切と思われるプロパティを宣言する必要があります。所有階層をどのように見ているか、およびどのような種類のオブジェクトを使用しているかに応じて、またはいずれweakかが適切な選択になる可能性があります。strong参照しています。)

iOS では、UIKit の作成者は現在問題となっている暗黙の保持を取り除きました。あなた自身の所有権を書くことが期待されています。ペン先やストーリーボードからオブジェクトを所有するつもりなら、strongプロパティを書きます。それについて知りたいだけなら、期待どおりに、weakまたは1 つを書きます。unsafe_unretained

TL;DR: ヒステリックな理由。

于 2012-08-30T04:10:18.707 に答える