iOS主要屬性修飾符包括:
- strong
- weak
- assign
- copy
- retain
- readwrite
- readonly
- nonatomic
- atomic
關(guān)于屬性修飾符strong的理解:
用strong修飾的屬性,是強(qiáng)引用,引用計(jì)數(shù)會(huì)加1,其賦值是調(diào)用objc_storeStong()函數(shù)
其實(shí)現(xiàn)方式如下:strong修飾的屬性賦值是先賦新值,然后才會(huì)釋放舊值
void
objc_storeStrong(id *location, id obj)
{
//將*location指向的對(duì)象賦值給prev
id prev = *location;
//如果新值和原來(lái)的值一致,則返回,無(wú)需繼續(xù)操作
if (obj == prev) {
return;
}
//對(duì)新值引用計(jì)數(shù)加一
objc_retain(obj);
//將對(duì)象指針指向新值
*location = obj;
//釋放舊值
objc_release(prev);
}
補(bǔ)充內(nèi)容
strong和weak的區(qū)別
1、strong和weak都只能用來(lái)修飾對(duì)象,strong修飾的屬性是強(qiáng)引用,當(dāng)對(duì)象沒(méi)有strong類型的指針指向他時(shí),對(duì)象就會(huì)被釋放;同時(shí)會(huì)清除所有的weak型指針;于此相反的,如果沒(méi)有strong類型指針指向?qū)ο?,即便存在weak類型的指針,對(duì)象也會(huì)被釋放,同時(shí)清除weak型指針
2、strong 修飾的控件,不管有沒(méi)有加到VC,該控件的內(nèi)存都會(huì)存在,會(huì)被VC強(qiáng)引用,只有在dealloc之后才會(huì)釋放;而weak修飾的控件,如果沒(méi)有被強(qiáng)引用,系統(tǒng)會(huì)自動(dòng)釋放掉
Strong和retain的區(qū)別
修飾屬性時(shí),strong和retain是一樣的效果
當(dāng)修飾block時(shí),會(huì)有很大的區(qū)別,strong相當(dāng)于copy,retain相當(dāng)于assign
block要用copy修飾,因?yàn)榉茿RC環(huán)境,不copy的block在棧內(nèi),ARC環(huán)境的block都是在堆內(nèi)
為什么block用scopy修飾,而不是strong或者其他修飾符
這是一個(gè)針對(duì)MRC的問(wèn)題,在MRC 下,block是創(chuàng)建時(shí)它的內(nèi)存是分配在棧區(qū)的
1、棧內(nèi)對(duì)象的特點(diǎn)就是隨時(shí)可能被銷毀,調(diào)用的時(shí)候會(huì)崩潰
2、block作用域是棧內(nèi),外部調(diào)用會(huì)崩潰
所以需要用copy修飾,將block復(fù)制到堆區(qū)
在ARC下,用strong或者copy修飾block都一樣,因?yàn)橄到y(tǒng)會(huì)自動(dòng)執(zhí)行copy操作
Strong和copy的區(qū)別
對(duì)于不可變對(duì)象,strong和copy的作用是一樣的,都是指向?qū)ο蟮牡刂?,copy是做了一次淺拷貝
當(dāng)修飾可變對(duì)象(nsmutableString、nsmutableArray等),copy修飾的屬性的set方法會(huì)將對(duì)象做了一個(gè)深拷貝,生成了一個(gè)新的對(duì)象賦值給copy修飾的屬性,這樣可變對(duì)象改變值的時(shí)候,copy修飾的屬性不會(huì)有改變
**修飾NSString時(shí)最好用copy,避免字符串的值被改變
Strong和assign的區(qū)別
assign和weak一樣,都是弱引用,不會(huì)持有對(duì)象,assign還能修飾基本數(shù)據(jù)類型
strong是強(qiáng)引用,會(huì)持有對(duì)象,直到引用計(jì)數(shù)為0的時(shí)候才會(huì)調(diào)用dealloc釋放內(nèi)存