16

Apple が「The Swift Programming Language」で述べたように、可能な限りunowned以下を優先する必要があるようです。weak

キャプチャされた参照が決して nil にならない場合は、弱い参照ではなく、所有されていない参照として常にキャプチャする必要があります。

このページの「弱い参照と所有されていない参照」セクションから

この2つの違いがよくわかりました。unownedしかし、よりも好む正当な理由はあります weakか?weakの方がはるかに安全だと思い[weak obj]ますobj.

パフォーマンスに関する考慮事項または見逃したものに関連していますか? それとも、常にweak代わりに使用してもまったく問題unownedありませんか?

4

2 に答える 2

1

Swift の強い、弱い、所有されていない参照

【Objective-Cのプロパティ属性】

ARC-タイプ[About]Automatic Reference Countingに適用されるメモリを管理するメカニズムです。オブジェクトは、参照が 0 の場合にのみ割り当て解除されます。reference

Strong reference- デフォルトで設定されており、このタイプを線形関係で安全に使用できます (ループはありません)。

Retain cycle- それぞれのオブジェクトが互いに強い参照を持っている状況です

Retain cycle:weakと を分割しunownedます。どちらもオブジェクトの保持カウントを だけ増加させず、+1次の違いがあります

Weak reference- 参照オブジェクトの割り当てが解除された場合はnil、参照もARC設定 します。それが参照が変数である理由です(定数にすることはできません)[var vs let]そしてそれが理由ですweaknilweakvarletoptional

weak var delegate: <Type>?

全般的

unowned- 参照オブジェクトが解放された場合 ( であるnil)、 は設定されていないためになりunowned ません。そのため、参照はオプションではありませんnilARCunowned

所有されていない(デフォルト)

safe unowned-参照の割り当てが解除されruntime safety checkた場合に例外をスローするために使用しunownedます。

Fatal error: Attempted to read an unowned reference but object 0x7fa5dad3f0f0 was already deallocated

所有されていない(安全でない)

unowned(unsafe)UnsafePointerを作成できることによって動作しますdangling pointer__unsafe_unretainedからObjective-C。これは、ARC処理を行わない一種のダイレクト メモリ アクセスです。クラッシュだけでなく、予期しない動作を引き起こす可能性があります。それはより良いパフォーマンスを持っています

EXC_BAD_ACCESS

[EXC_BAD_ACCESS]
[閉鎖サンプル]

于 2020-04-03T21:14:08.703 に答える