《objective-c基礎教程》學習筆記(七)—— 存取方法

  在上一篇博文中,咱們有拿一個簡單的「汽車模型」來說解複合關係。在今天的這篇博文中,咱們將接着上一次的例子,講解下存取(accessor)方法的使用。所謂存取方法,就是用來讀取或改變某個對象屬性的方法。若是添加一個方法去改變Car對象中的engine對象變量,那它就是一個存取方法。數組

  存取方法分爲兩種:setter方法和getter方法。setter方法,是爲對象中的變量賦值。getter方法,是經過對象自己訪問對象屬性。安全

  在Objective-c中,Cocoa框架在定義存取方法的時候,有相關的規定:框架

  (1). setter方法,根據它的所要去改變的屬性名稱來命名,並在前面加set前綴。如:setEngine,setTire等。函數

  (2). getter方法,則是以其返回的屬性名稱來命名,不要get前綴加到getter方法名前面。由於在Cocoa中,get前綴有其餘的用途。通常意味着這個方法會將你傳遞的參數做爲指針來返回數值。性能

  介紹完了基本的概念和定義的規則。下面,咱們就來修改「汽車模型」,給汽車的engine和tire設置存取方法。學習

首先,先在Car對象定義中添加engine和tire的存取方法:atom

 1 @interface Car : NSObject
 2     {
 3         Engine *engine;
 4         Tire *tires[4]; //四個輪子,定義一個四個數的數組。
 5     }
 6     -(Engine *) engine; 
 7     -(void) setEngine:(Engine *) newEngine;
 8     -(Tire *) tireAtIndex:(int) index;
 9     -(void) setTire:(Tire *) tire atIndex:(int) index;
10     -(void) drive;
11 @end // Car

  因爲,tire有四個子集,因此這裏還添加了一個atIndex參數,表示第幾個輪子。接下來,實現Car中定義的存儲方法:spa

 1 @implementation Car
 2     -(void) setEngine:(Engine *) newEngine
 3     {
 4         engine = newEngine;
 5     }
 6 
 7     -(Engine *) engine
 8     {
 9         return (engine);
10     }
11 
12     -(void) setTire:(Tire *) tire
13             atIndex:(int) index
14     {
15         if(index<0 || index>3)
16         {
17             NSLog(@"bad index(%d) in setTire:atIndex",
18                   index);
19             exit(1);
20         } 
21         tires[index] = tire;
22     }
23 
24     -(Tire *) tireAtIndex:(int) index
25     {
26         if(index<0 || index>3)
27         {
28             NSLog(@"bad index(%d)in tireAtIndex:",
29                   index);
30             exit(1);
31         }
32         return (tires[index]);
33     }
34 
35     -(void) drive{
36         NSLog(@"%@",engine);
37         NSLog(@"%@",tires[0]);
38         NSLog(@"%@",tires[1]);
39         NSLog(@"%@",tires[2]);
40         NSLog(@"%@",tires[3]);
41     }
42 @end

  爲了傳入的index參數不符合條件,使得超出數組,咱們作了簡單的判斷。最後,咱們修改main主函數:線程

 1 int main(int argc, const char * argv[])
 2 {
 3     Car *car = [Car new];
 4     Engine *engine = [Engine new];
 5     [car setEngine:engine];
 6     for(int i=0;i<4;i++)
 7     {
 8         Tire *tire = [Tire new];
 9         [car setTire:tire atIndex:i];
10     }
11     
12     [car drive];
13     return 0;
14 }

  這時,咱們發現:以前在Car中定義的init初始化方法,這邊移除掉了。因爲Car如今本身定義了訪問engine和tires變量的方法。因此,不須要init方法來建立。而是直接在主函數中建立Engine和Tire。指針

  運行結果和以前的沒有區別:

  經過這個簡單修改的例子,但願你們對Cocoa框架中的存取方法的使用方法有更深的瞭解。

 

2014.12.07 後續更新部分

  在這幾天的學習中,發現Objective-C在實際的使用了,不少都是用合併存取方法來實現。全部,這裏,我想擴展給你們一塊兒分享下。

  讓系統自動合併setter和getter只要兩個步驟:

(1). 在類接口部分使用@property指令定義屬性。

(2). 在類實現的部分使用synthesize指令聲明該屬性便可。

  全部,上面例子中定義Engine的存取方法咱們能夠修改爲如下代碼:

原來的setter方法和getter方法能夠合併改爲:

1 /* 3.Car */
2 @interface Car : NSObject
3 {
4     Engine *engine;
5     Tire *tires[4]; //四個輪子,定義一個四個數的數組。
6 }
7 @property(nonatomic)Engine* engine;
8 @end // Car

實現方法只要這樣:

1 @implementation Car
2      @synthesize engine;
3 @end;

  在使用@property指令的時候,後面會帶上一些參數,具體的做用這邊大體介紹下。要想深刻了解,能夠以後本身百度之。

atomic(nonatomic):指定合成的存儲方法是否爲原子操做。即:主要指是否線性安全。aomic能夠保證對象數據完整性,可是線程的安全性下降。nonatomic能夠提升存儲方法的訪問性能。

copy:當調用setter方法對成員變量賦值的時候,會將被賦值的對象複製成一個副本,再將該副本賦值給成員變量。copy指令能夠避免當計數器的值爲0的時候,對象被清除。

readonly:指示系統只合成getter方法,再也不合成setter方法。即:定義的方法只讀,不能給賦值。

readwrite:是默認值,指示系統須要合成setter,getter方法。

retain:當把某個對象賦值給該屬性時,該屬性原來所引用的對象的引用數減1,被賦值對象的引用數加1。(ARC內存機制中用到)

retainCount:獲取引用的對象的引用數

weak:指示符指定該屬性對被賦值對象持有弱引用。即:即便該弱引用指向被賦值的對象,該對象也可能被回收

strong:指示符指定該屬性對被賦值對象持有強引用。即:只要該搶引用指向被賦值的對象,那麼該對象就不會自動回收

相關文章
相關標籤/搜索