IOS-OC-@synthesizeの役割

3414 ワード

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]が典型的な例です.シナリオ1:@synthesizeを使用しないで、自動的に生成されたアンダースコア付きインスタンス変数名を使用できるシナリオ2:@synthesizeを使用して、@synthesizeを使用しないで宣言された属性=変数と同じ属性にアンダースコア付きエイリアスを属性に追加します.属性のsetter,getterメソッドを,この変数に作用させるという意味である.synthesizeのもう一つの役割は、属性に対応するインスタンス変数を指定できることです.例えば、@synthesize age=myAgeと書くことができます.じゃあ呼び出しに行った時ageは実際には操作のインスタンス変数myAgeであり、_ではない.ageしました.シナリオ3:@synthesizeを使用して属性に任意の別名を追加すると、自動的に生成されたインスタンス変数名を使用するとエラーが発生し、指定した別名のみが使用されます.

に注意


1属性のsetterメソッドとgetterメソッドは同時に書き換えることができません.これは、この2つのメソッドを同時に書き換えると、システムがこのメンバー変数を生成しないため、エラーが発生し、本当にこの属性のsetterとgetterメソッドを書き直さなければならない場合は、メンバー変数を手動で生成して書き換えることができます.あるいは
@synthesize:
@synthesize age = myAge;
 
- (void)setAge:(NSString *)age {
    myAge = age;
}
 
- (NSString *)age {
    return myAge;
}

2 getterメソッドで最後にreturn_を返すage;return selfではありませんage、これは、点構文が実際にsetterメソッドとgetterメソッドの呼び出しであるため、getterメソッドでreturn selfが呼び出される場合である.ageでは、ループ呼び出しが行われます.3属性のsetterメソッドを書き換えるとき、私たちは一般的にこのように書きます.
- (void)setInfoArr:(NSArray *)infoArr {
    _infoArr = infoArr;
    _infoArr = @[@" "];
}

setterメソッドにこの文を追加する必要があります.infoArr = infoArr;,setterメソッドを書き換えるときに、属性変数に新しい値infoArrを割り当てます.infoArrは外で呼び出すために使用されます.4当hファイルの属性はreadonly,.mファイルでは@synthesizeというキーワードを使わずに初期化することができます.初期化の方法は次のようになります.
@property (nonatomic,strong,readonly) UILabel *placeHolderLabel;
- (void)setUpPlaceHolderLabel {
    _placeHolderLabel = [[UILabel alloc] init];
    _placeHolderLabel.textColor = [self.class defaultPlaceholderColor];
    _placeHolderLabel.numberOfLines = 0;
    _placeHolderLabel.userInteractionEnabled = NO;
    _placeHolderLabel.font  = self.font;
}
- (UILabel *)placeHolderLabel {
    UILabel *label = objc_getAssociatedObject(self, @selector(placeHolderLabel));
    if (!label) {
        label = [[UILabel alloc] init];
        label.textColor = [self.class defaultPlaceholderColor];
        label.numberOfLines = 0;
        label.userInteractionEnabled = NO;
        label.font  = self.font;
                objc_setAssociatedObject(self, @selector(placeHolderLabel), label, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
        [self updatePlaceholderLabel];
    }
    return label;
}
@property (nonatomic,strong,readwrite) UILabel *placeHolderLabel;

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