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