OC @property和@synthesize小結
一、@property 是什麼?
簡單點說,屬性就是一種支援訪問物件成員變更的快捷的方法,可以自動的生成setter和getter方法.
面向物件思想的基本特點為封裝、繼承、多型。 封裝性主要體現在無法直接訪問物件成員變數,如果需要的話,通過setter和getter方法訪問成員變數。這樣的話,通常要為每一個支援外邊訪問的成員變數寫兩個方法,這種操作比較繁瑣且無意義。通過@property可以簡化這種方法。
宣告:屬性要在標頭檔案中宣告,宣告格式為: @property (attributes) type propertyName;
實現(合成):實現要在.m檔案中,格式為 @synthesize name = _name;
成員變數訪問許可權:標頭檔案中宣告的成員變數,預設是protected,.m檔案中宣告的成員變數,預設是private的。合成屬性時,@synthesize propertyName = _name;如果變數_name沒有宣告,系統會自動生成該成員變數且為private許可權。如果_name已宣告,它們會自動合成
Class.h中
interface ClassA : NSObject { int _size; //預設為protected @public //可以通過這種方式指定成員變數的訪問許可權 int _name; int _length; @protected int _wight; @private int _num; } @property int name; @property int length; @end
Class.m中
@implementation ClassA{
int _water;//此處宣告的變數為private的
}
@synthesize name=_name;
//前者賦值給後者,若@synthesize name=_length;,即表示傳入的name值賦值給length.
@end
注意: 1. 在xcode4.4以後的版本,系統會自動合成, 等價於自己寫了程式碼“ @synthesize name = _name;” 。 也就是說如果沒有特殊需求,只需要在標頭檔案中宣告而無需實現,就可以直接使用了。 2.如果沒有告訴@propetry要傳入的引數賦值給誰,預設@propetry會傳入的屬性賦值給_開頭的成員變數
二、使用
宣告一個屬性,如果沒有宣告為只讀的,它預設會生成兩個方法 - (type)name 和 - (void)setName; 為了可讀性等其它原因,也可以改變屬性的setter和getter訪問名稱,
@property (setter=setMyValue, getter=getBool) NSInteger value; //會把setter名稱變為setMyValue,getter名稱變為getBool
這樣的話就可以通過 [obj setMyValue:10] 和 [obj getBool]方法業訪問成員變量了,此時setValue方法會被覆蓋,不再存在。
三、@property的修飾屬性(attributes )
格式: @propetry(屬性修飾符) 資料型別 變數名稱
例子:@property(readonly) int size;
可讀性:readwrite / readonly ,不寫的話預設為readwrite,即會合成setter和getter方法。
原子性:nonatomic / 【預設】,系統預設setter和getter為原子操作(沒有atomic關鍵字),如果想設定為非原子操作,可以nonatomic。
記憶體 assign / retain / weak / strong ,在非ARC環境下, assign為預設,引用計數不變;retain引用計數加1;在引用計數環境下,預設為strong,與retain作用相同;從5.0系統後引入了weak,作用與assign相似,不過當所指向物件引用為0時,自動置為nil。