1. 程式人生 > >[學習筆記—Objective-C]《Objective-C-基礎教程 第2版》第十一章 屬性

[學習筆記—Objective-C]《Objective-C-基礎教程 第2版》第十一章 屬性

變量名 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版》第十一章 屬性