OC學習筆記之屬性詳解和易錯點,oc學習筆記
屬性的概念在OC1.0中就存在,格式是定義執行個體變數,然後定義setter和getter方法,用點操作符操作屬性
舉例,類的介面部分
1 @interface Father : NSObject 2 { 3 NSInteger _item; 4 } 5 #pragma mark - 屬性 6 -(void)setItem:(NSInteger)item; 7 -(NSInteger)item; 8 9 -(void)setAAA:(NSInteger)aaa;10 -(NSInteger)AAA;11 12 @end
類的實現部分
1 #import "Father.h" 2 3 @implementation Father 4 5 -(void)setItem:(NSInteger)item{ 6 _item = item; 7 } 8 -(NSInteger)item{ 9 return _item;10 }11 12 -(void)setAAA:(NSInteger)aaa{13 _item = aaa;14 }15 -(NSInteger)AAA{16 return _item;17 }18 19 @end
main函數
1 Father *test = [[Father alloc]init];2 test.item = 19;3 NSLog(@"%ld",test.item);4 5 test.AAA = 20;6 NSLog(@"%ld",test.AAA);
在上邊的樣本中定義了一個執行個體變數和兩個屬性,兩個屬性操作同一個執行個體變數,注意,屬性和執行個體變數沒有必然的聯絡,屬性只是操作執行個體變數(甚至不操作執行個體變數,後面會詳細解釋),但是setter和getter方法的命名規則需要注意,setter方法的命名是set+屬性名稱,getter的命名方法是屬性名稱(屬性AAA的setter方法是setAAA:,getter方法名是AAA)
OC2.0以後提供了@property和@synthesize關鍵字從文法層簡化了屬性的書寫
屬性的聲明
1 #import <Foundation/Foundation.h> 2 3 @interface Father : NSObject 4 { 5 NSInteger _item; 6 NSString *_str; 7 } 8 #pragma mark - 屬性 9 @property NSInteger item;10 @property NSString *AAA;11 12 @endView Code
屬性的實現
1 @implementation Father2 3 @synthesize item = _item,AAA = _str;4 5 @endView Code
此時應注意,兩個不同屬性不能同時操作同一個執行個體變數,語法檢查會報錯。
Xcode5以後,屬性實現部分的代碼可以省略,Xcode會產生屬性實現的代碼(蘋果官方推薦寫法)
在這裡需要注意的點有點多,一一分析。
在省略屬性實現部分代碼後,Xcode給出的預設的屬性實現的代碼是這樣的
@synthesize 屬性1 = _屬性1,屬性2 = _屬性2;
也就是屬性操作的執行個體變數時_+屬性名稱,以上面屬性聲明代碼為例,Xcode產生的程式碼是這樣的
@synthesize item = _item,AAA = _AAA;
注意我們的類介面檔案中只有_item,_AAA是沒有的,這個變數是沒有的,他是Xcode自動產生的真.私人執行個體變數,為什麼加個真呢,因為這個變數不會產生在介面檔案中,只會聲明在類的實現檔案中,而且是聲明在類的最上端,大致是這樣的
1 @implementation Father2 3 NSString *_AAA;4 5 @synthesize item = _item,AAA = _AAA;6 7 @endView Code
因此Father作為父類時_AAA是不會像@private下的執行個體變數一樣被繼承的,所以不推薦大家在子類中聲明和父類中相同名稱的屬性,尤其是沒有相對應的執行個體變數的時候,理由大家可以考慮下。
最後簡單介紹下屬性的修飾詞,一共有三類
讀寫性修飾詞:readwrite(預設) readonly
原子性又叫安全執行緒修飾詞:atomic(預設) nonatomic
語義性修飾詞:assign retain copy
讀寫性修飾詞就和字面意思一樣可以控制屬性的讀寫,預設是readwrite可讀可寫的當你設定成readonly時,此屬性不可寫,給屬性寫指派陳述式的話編譯會報錯
執行緒安全性就是控制線程是不是安全的(廢話麼。。。)
在這開個傳送門有興趣的童鞋可以看下 http://www.cnblogs.com/zwq194/archive/2012/06/26/2563567.html
語義性修飾詞其實就是記憶體控制
同樣開個傳送門 http://blog.csdn.net/hahahacff/article/details/39839571