前言
大家好,我是milo敷扫,今天這篇文章講的是@property在MRC和ARC下的使用和對比事哭。
@property的參數(shù)
(1)線程方面
??atomic(默認):幾乎不用,低性能 睦袖,僅能保證讀寫安全(通過互斥鎖),并不能保證線程安全荣刑。
??nonatomic:高性能馅笙,一般使用這個。
(2)內(nèi)存管理方面
??1.MRC
??1> assign (默認): 基本數(shù)據(jù)類型厉亏、枚舉董习、結(jié)構(gòu)體(非OC對象),當2個對象相互引用爱只,一端用retain皿淋,一端用assign,多對象時,也只需保持一端assign
??2> copy : 只用于NSString\block
??3> retain : 除NSString\block以外的OC對象
??2.ARC
??1> assgin(默認) : 基本數(shù)據(jù)類型、枚舉窝趣、結(jié)構(gòu)體(非OC對象)
??2> copy : 只用于NSString\block
??3> strong : 除NSString\block以外的OC對象(相當于retain)
??4> weak : 用于UI控件和delegate疯暑。當2個對象相互引用,一端用strong哑舒,一端用weak妇拯,多對象時,也只需保持一端weak(weak是弱引用洗鸵,沒有引用時釋放內(nèi)存和指針)
??!!!內(nèi)存管理需要注意的地方:內(nèi)存管理的關(guān)鍵字是通過在setter/getter方法里生成相關(guān)代碼來實現(xiàn)內(nèi)存管理的乖阵。
如:
當我們使用retain的時候:
@property(nonatomic,retain) Dog *dog预麸;
實際上瞪浸,setter/getter方法就變成了如下:
- (void)setDog:(Dog *)dog
{
if(_dog != dog){ //判斷是否需要重新賦值
[_dog release]; //釋放舊引用,計數(shù)器-1
_dog = [dog retain]; //重新賦值吏祸,計數(shù)器+1
}
}
跟我們所學的自己寫的retain的管理一模一樣(包括使用atomic上鎖也是在setter/getter里面加@synchronized)
在這里就不展開逐個驗證了对蒲,就上個結(jié)論:
1.retain:先release舊值,再retain新值
2.assign:直接賦值贡翘,不考慮內(nèi)存管理蹈矮。
3.copy:先release舊值,再copy新值鸣驱,copy的本質(zhì)為復(fù)制該內(nèi)存所存儲的內(nèi)容泛鸟,重新創(chuàng)建一個對象賦給其相同的內(nèi)容,很明顯踊东,在copy這個過程中也發(fā)生了一次retain北滥,不過這是個全新的對象。
(3)是否生成setter方法
??readwrite(默認):同時生成setter和getter的聲明和實現(xiàn)
??readonly:只讀闸翅,只會生成getter的聲明和實現(xiàn)
(4)Set和get方法的名稱
??修改set和get方法的名稱拦宣,主要用于布爾類型等浊。因為返回布爾類型的方法名一般以is開頭流部,修改名稱一般用在布爾類型中的getter导狡。
@propery(nonatomic,getter=isRich) BOOL rich;
BOOL b=p.isRich;// 調(diào)用
??如果要修改set方法,記得在方法后面加個 “ :” 记某,因為set是帶參數(shù)的司训,如:
@propery(nonatomic,setter=setIsRich:) BOOL rich;