[學習筆記—Objective-C]《Objective-C-基礎教程 第2版》第十一章 屬性
阿新 • • 發佈:2017-07-18
變量名 erl .text nonatomic syn split view 不能 -name
11.1 使用屬性值
@property float rainHandling;
//表明此類具有float類型的屬性,其名稱為rainHandling
註意:屬性的名稱不必與實例變量名稱同樣。
@synthesize rainHandling;
//表示創建了該屬性的訪問代碼
註意:使用屬性後,能夠不聲明實例變量。編譯器會聲明。
有兩個地方能夠加入實例變量聲明:
- 頭文件:讓子類直接通過屬性訪問變量
- 實現文件:變量僅僅屬於當前類
點表達式:
- 點表達式出如今(=)的左邊:setter方法
- 點表達式出如今(=)的右邊:getter方法
註意:假設訪問屬性提示訪問的對象不是struct類型,請檢查當前類是否已包括了所需的必備頭文件
11.2 屬性擴展
屬性同樣適用於int,char。BOOL,struct類型,也能夠定義一個NSRect對象的屬性
保留死循環(retain cycle):Car對象擁有engine對象,可是engine對象不能反過來擁有Car對象。
copy特性
- name存取方法:
- (void)setName: (NSString *)newName {
[name release];
name = [newName copy];
} // setName
- (NSString *)name {
return (name);
} // name
等同於:
//name屬性是copy特性
@property (copy) NSString *name;
@synthesize name;
retain特性:
- engine 的存取方法:
- (void) setEngine: (Engine *) newEngine{
[newEngine retain];
[engine release];
engine = newEngine;
} // setEngine
- (Engine *) engine{
return (engine) ;
} // engine
等同於:
//engine屬性使用的是保留和釋放特性
@property (retain) Engine *engine;
@synthesize engine;
noatomic特性:iOS程序常常使用的技術。資源有限的設備上獲得更好的性能。
假設自定義了存取方法。那麽必須使用nonatomic特性。
默認特性:假設沒有為屬性指定不論什麽特性,它們會默認使用nonatomic和assign特性。
11.21 名稱的使用
屬性的名稱一般與支持屬性的實例變量名稱同樣。
有時程序猿希望實例變量是一個名稱,而公開的屬性是還有一個名稱。
@property(copy)NSString *name;
@synthesize name = appellation;
// 編譯器將創建-setName:和-name方法,但在實現代碼中用的是appellation實例變量。
註意:
直接訪問實例變量:self.name
使用訪問方法進行賦值:[self setName:@"Car"];
11.22 僅僅讀屬性
對於僅僅能讀取,無法更改的值:
@property(readonly)float shoeSize;
註意:僅僅生成一個getter方法而不會生成setter方法
11.23 自己動手
@dynamic
告訴編譯器不要生成不論什麽代碼或創建對應的實例變量。
改變方法名:
使用getter=和setter=特性就能夠自定義想要的方法名稱
@property (getter=isHidden) BOOL hidden;
//告訴編譯器生成名為isHidden的getter方法,並生成名為默認setHidden:的setter方法
註意:屬性僅僅支持替代-setBlah和-blah方法,但不支持那些須要接收額外參數的方法
[學習筆記—Objective-C]《Objective-C-基礎教程 第2版》第十一章 屬性