OC學習筆記之屬性詳解和易錯點,oc學習筆記

來源:互聯網
上載者:User

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

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.