Objective-C 屬性



Object-C屬性


@property (retain,nonatomic)UILabel titleLabel;  

objective-C中添加屬性之前,通常會定義一些方法用於設置和檢索類的實例變量的值。這些方法稱爲訪問方法和修改方法(或稱爲獲取方法和設置方法)。  


屬性的點表示法:

text =  [_titleLabeltext];

    text = _titleLabel.text;  

就編譯器而言,這兩條語句是完全相同的,點表示法同樣適用於修改方法,如下:

    [_titleLabelsetText:@"123"];

    _titleLabel.text =@"123";



在聲明中,@property關鍵字後面緊跟着一些可選屬性(位於圓括號內),它們進一步定義編譯器將如何創建訪問方法和修改方法。


(1)retain: 通知編譯器向分配給此屬性的對象發生一個保留(retain)消息。這將確保屬性底層的實例變量在使用過程中不會從內存清除。這是必不可少的,默認行爲(assign)需要與垃圾收集一起使用。如果定義的一個屬性是對象(與int等原始數據類型相反),則通常在可選屬性中指定retain。

爲int、float或其他原始數據類型聲明屬性時,不需要指定任何可選屬性。

(2)nonatomic: 將更改訪問方法和修改方法的生成方式。在默認情況下,這些方法在創建時會具備另外一些代碼,用於幫助你編寫多線程程序。這些額外的開銷雖然較小,但是對於聲明指向用戶界面對象的指針沒有必要,因此我們通過聲明nonatomic來節省一些開銷。一般規則,大多數情況下,都將指定nonatomic屬性。

(3)assign: 用於int、float等原始數據類型,(此屬性爲默認值)



iOS5新功能ARC(Automatic Reference Counting),新的關鍵字: strong,weak,unsafe_unretained 

(4)strong:於retain類似,引用計數自動+1,  (owning)

(5)weak: 用weak修飾,一旦內存被釋放,指針將都指向nil,可以防止野指針。(non-owning) 如: Delegate, IBOutlet一般用weak

(6)copy: 建立一個索引計數爲1的對象,釋放舊的對象。此屬性僅用於對象類型,它必須實現NSCopying協議, 如: NSString,Block

(7)unsafe_unretained: 與weak有點類似,但是它是unsafe的,一旦內存釋放,容易造成野指針閃退, 儘量少用unsafe_unretained

copy與retain的區別: 

1)retain是指針拷貝,copy是內容拷貝; retain的set方法是淺複製,copy的set方法是深複製。

2)建立一個索引計數爲1的對象,然後釋放舊對象,對NSString。它指出,在賦值時使用傳入值的一份拷貝。copy工作由copy方法執行,此屬性只對那些實現了NSCopying協議的對象類型有效 。

3)釋放舊的對象,將舊對象的值賦予輸入對象,再提高輸入對象的索引計數爲1。對其他NSObject和其子類。指定retain會在賦值時喚醒傳入值的retain消息。此屬性只能用於Objective-C對象類型,而不能用於Core Foundation對象。



以上爲常用來聲明屬性,__strong, __weak, __unsafe_unretained, __autoreleasing,常用來聲明臨時變量


(8)__block: ARC與MRC模式下都可用,可以修飾對象,也可修飾基本數據類型。

(9)__weak: 只能在ARC模式下使用,只能修飾對象,不能修飾基本數據類型(int等)。

(10)__block: 對象可以在block中改變值。




參考:[iPhone 開發基礎教程] 

  http://www.cnblogs.com/langtianya/p/3691035.html

  http://blog.sina.com.cn/s/blog_4ac45c260102w3a5.html

  http://www.jianshu.com/p/c1d609d1569b










發佈了38 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章