1. 程式人生 > >OC @property和@synthesize小結

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會傳入的屬性賦值給_開頭的成員變數

. [email protected]不會對傳入引數資料進行判斷或過濾,如果需要判斷或過濾,必須重寫getter和setter方法. 4.如果利用@propetry來生成的getter和setter方法,可以不寫成員變數,系統會自動生成一個_開頭的成員變數.ps:@該成員變 量是私有的,是在.m檔案中生成的,並不是.h檔案中. 5.如果重寫了setter,那麼@property就只會生成getter方法. 6.如果重寫了getter,那麼@property就只會生成setter方法. 7.如果同時重寫了setter和getter,那麼@property不會自動幫生成私有成員變數

二、使用

宣告一個屬性,如果沒有宣告為只讀的,它預設會生成兩個方法 - (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。