@synthesizeの役割

1621 ワード

原文リンク:Why use@synthesize statements

翻訳


iOS 6の後、LLVMコンパイラはproperty autosynthesis、すなわち を導入する.すなわち、コンパイラは、以下のような@propertyごとに@synthesizeを追加します.
@synthesize propertyName = _propertyName;

この行コードは、getterメソッドとsetterメソッドを生成しながら、下線接頭辞付きインスタンス変数名を作成します.
@synthesizeを使用する目的は1つだけです.インスタンス変数に別名を付けるか、同じ変数に2つの名前を追加します.
自動合成を阻止するには、@dynamicを使用してください.古典的な使用シーンは、getter/setterメソッドがどこかで実装されていることを知っていて、コンパイラが知らない場合です.
ここで私の理解は、コンパイラが自動合成を使用して新しいsetter/getterを生成すると、既存の古いsetter/getterが上書きされることを防止するためです.
自動合成にはメモリの意味がないため、ARCに接続されていません.setter/getterメソッドを手動で実装したり、読み取り専用オブジェクトにgetterメソッドを実装したりした場合、自動合成は影響しません.手動で実装するには変数が必要で、宣言するだけでいいので、@synthesizeを追加して別名を追加する必要はありません(可能ですが).
もう1つのケースでは、protocolで属性を宣言して実装する場合に@synthesizeを使用する必要があります.プロトコルで宣言された属性はsetterやgetterを自動的に生成しません.[UIAPplicationDelegatewindow]が典型的な例です.
拡張読書
iOSプロトコルでメンバー変数と属性を定義できますか?

コード検討


シナリオ1:@synthesizeを使用せずに、自動的に生成された下線付きインスタンス変数名を使用できます.
シナリオ2:@synthesizeを使用して属性に下線付きの別名を追加します.@synthesizeを使用しないのと同じです.
シナリオ3:@synthesizeを使用して属性に任意の別名を追加すると、自動的に生成されたインスタンス変数名を使用するとエラーが発生し、指定した別名のみが使用されます.

まとめ


1.@synthesizeの役割:属性にインスタンス変数名、または別名を追加します.このプロパティのsetter/getterメソッドも生成されます.2.@synthesizeを禁止:ある属性がすでにどこかで自分のsetter/getterを実現している場合、@dynamicを使用して@synthesizeが自動的に新しいsetter/getterオーバーライドを生成することを阻止できます.3.メモリ管理:@synthesizeはARCとは関係ありません.4.使用:一般的には@synthesizeを属性に追加する必要はありませんが、protocolで宣言された属性などの特殊な状況が必要です.