前言
@propertyと@synthesizeはXcode 4.4以前はずっと協力して使用していましたが、4.4以降、@propertyが強化され、1行のコードコンパイラがsetterとgetterメソッドの宣言と実現を自動的に生成してくれます.mファイルに属性名と同じ下線を持つメンバー変数(private)を宣言します.
例を挙げる
はXcode 4にある.4より前のPerson.h
@property (nonatomic, assign) NSInteger age;
// , name setter and getter
- (void)setAge:(NSInteger)age;
- (NSInteger)age;
Person.m
@synthesize age;
// , Person.m _name , setter and getter
はXcode 4にある.4以降@propertyが強化され、1行のコードでsetter and getterメソッドの宣言と実装、およびメンバー変数の宣言が完了します.
@property (nonatomic, assign) NSInteger age;
注意 setter and getter方式を同時に書き換えると、システムがエラーを報告します.なぜなら、見つからないからです.ageこの変数[画像のアップロードに失敗しました...(image-13 c 4 ab-1254421738)] 解決策第一案:在.hのファイルにこの属性を宣言する Person.h
@interface Person : NSObject {
NSInteger _age;
}
@property NSInteger age;
@end;
第二案:在.mのファイルで@synthesize を使用
@implementation Person
@synthesize age = _age;
- (void)setAge:(NSInteger)age {
_age = age;
}
- (NSInteger)age {
return _age;
}
初心者は以下のコードが特におかしいと思うかもしれません@synthesize age = _age;
実際には、コンパイラageのプロパティを_ageインスタンス変数生成setter and getterメソッドの実装すなわちage属性のsetterメソッドはsetAgeであり、それは_ageという変数. この値を付与するように見える操作により、@synthesizeで変数名とは異なるsetterとgetterの名前を定義し、変数が不適切にアクセスされないように保護することができます. AppleのSample Codeを見ると、この書き方はよく見られるです.
上記の原理がわかったら、私たちも知っています.ageとageの違い. _ageはメンバー変数 ageは属性である.
最後に操作したのはメンバー変数です
最後に
@propertyの修飾子をまとめます
readwrite:デフォルト属性で、setterメソッドとgetterメソッドの宣言と実装が自動的に生成されます.
readonly:getterを生成するだけでsetter は生成されません.
atomic:原子属性、生成されたsetterおよびgetter法は原子操作である.複数のスレッドが同時にsetterを呼び出す場合、あるスレッドがsetterのすべての文を実行する前に、別のスレッドがsetterを実行し始めることは、メソッドのヘッダにロックがかかっているのと同じです.セキュリティは高いが、プログラム特別のカード(開発では一般的にこの属性を使用しない)を招く.
nonatomic:非原子属性で、マルチスレッドの場合はデータに問題があるかもしれませんが、パフォーマンスが向上します.(開発でよく使われる) assign:この属性は一般的にint,char,floatなどの基本データ型を処理し、assignはデフォルトであり、この属性を追加しなくてもよい.参照数は変更されません. retain:古いオブジェクトにreleaseを割り当て、入力オブジェクトretainを古いオブジェクトに割り当てます.
copy:これは、メモリにオブジェクトのコピーを新たに生成することに相当します.これにより、宣言したメンバー変数を変更することはできません.オブジェクトのコピー(デプスコピー)を使用するべきことを指定し、前の値からreleaseメッセージを送信します.基本的にretainのようですが、参照カウントは増加せず、新しいメモリを割り当てて配置します.copyは新しいオブジェクトを作成し、retainはポインタを作成し、参照オブジェクトのカウントに1を加算します.