定義屬性中的特性有atomic褐望、nonatomic、copy坛吁、assign劳殖、strong、weak等拨脉,一般格式如下:
atomic:
默認(rèn)屬性哆姻。
當(dāng)前進(jìn)程進(jìn)行到一半時(shí),其他線程訪問(wèn)當(dāng)前線程玫膀,可保證先執(zhí)行完當(dāng)前線程矛缨。
只保證setter/getter完整,即讀寫(xiě)安全(使用了自旋鎖(原子操作),確保線程同步)箕昭,不是線程安全灵妨。
nonatomic:
非默認(rèn)屬性。
兩個(gè)線程同時(shí)訪問(wèn)同一個(gè)屬性將會(huì)導(dǎo)致無(wú)法預(yù)計(jì)的結(jié)果落竹。
優(yōu)點(diǎn)是程序運(yùn)行速度快泌霍。
copy:
是owner,不是reference筋量。當(dāng)對(duì)象可變時(shí)烹吵,可設(shè)為copy,用于獲取此值的副本桨武。
新的對(duì)象引用計(jì)數(shù)為1肋拔,與原始對(duì)象引用計(jì)數(shù)無(wú)關(guān),且原始對(duì)象引用計(jì)數(shù)不會(huì)改變呀酸。
使用copy創(chuàng)建的新對(duì)象也是強(qiáng)引用凉蜂,使用完后需要釋放掉該對(duì)象。
copy特性可以減少對(duì)象對(duì)上下文的依賴(lài)性誉。新對(duì)象窿吩、原始對(duì)象中任一對(duì)象的值改變不會(huì)影響另一對(duì)象的值。
要想設(shè)置該對(duì)象的特性為copy错览,該對(duì)象必須遵守NSCopying協(xié)議纫雁,F(xiàn)oundation類(lèi)默認(rèn)實(shí)現(xiàn)了NSCopying協(xié)議,只需要為自定義的類(lèi)實(shí)現(xiàn)該協(xié)議即可倾哺。
assign:
與copy相反轧邪,只是reference(引用),不是owner(所有者)羞海,只返回指針忌愚。
用于CGFloat、NSInteger却邓、BOOL等類(lèi)型硕糊。
釋放后再發(fā)送消息會(huì)導(dǎo)致程序崩潰。
strong:
默認(rèn)屬性腊徙。
strong == retain简十,iOS引入ARC后,用strong替代了retain撬腾。
創(chuàng)建一個(gè)強(qiáng)引用的指針勺远,引用對(duì)象的引用計(jì)數(shù)加1。
strong特性表示兩個(gè)對(duì)象內(nèi)存地址相同(建立一個(gè)指針时鸵,進(jìn)行指針拷貝),內(nèi)容會(huì)一直保持相同,直到變更一個(gè)對(duì)象的內(nèi)存地址饰潜,或?qū)⑵湓O(shè)置為nil初坠。
如果有多個(gè)對(duì)象同時(shí)引用一個(gè)屬性,任一對(duì)象對(duì)該屬性的修改都會(huì)影響其他對(duì)象獲取的值彭雾。
所有實(shí)例變量碟刺、局部變量默認(rèn)都是strong。
weak:
只是reference(引用)薯酝,不是owner(所有者)半沽,即引用計(jì)數(shù)不會(huì)加1。
可將weak對(duì)象設(shè)為nil吴菠,向nil發(fā)送消息者填,什么都不會(huì)執(zhí)行,程序也不會(huì)崩潰做葵。
代理使用weak占哟。delegate幾乎一直own代理對(duì)象,所以代理對(duì)象應(yīng)該對(duì)代理使用weak酿矢,否則會(huì)形成循環(huán)引用(retain cycle)榨乎。但也有例外,如果代理對(duì)象的生命周期比代理短瘫筐,代理對(duì)象也可以使用strong蜜暑。
IBOutlet常用weak。
readonly:
非默認(rèn)屬性策肝。
只有可讀方法肛捍,即getter方法。
readwrite:
默認(rèn)屬性驳糯。
若希望屬性只允許自己讀寫(xiě)篇梭,而對(duì)所有外部文件都是只讀的,那么可以在接口的位置聲明該屬性為readonly類(lèi)型酝枢,在私有接口的位置重新該屬性為readwrite類(lèi)型恬偷。
有關(guān)strong與weak對(duì)比的生動(dòng)形象例子!
假設(shè)對(duì)象是一條小狗帘睦,小狗想跑走(be deallocated)袍患。
strong類(lèi)型就像是拴狗的繩子,只要有一條繩子栓住狗竣付,它就不能跑走诡延,如果有五條繩子拴著同一條狗(五個(gè)strong類(lèi)型指向同一個(gè)對(duì)象),只有當(dāng)五條繩子都釋放狗才可以跑走古胆。
weak類(lèi)型就像是小孩子看著小狗說(shuō):看這里有小狗肆良。只要還有繩子拴著小狗筛璧,小孩子們就可以繼續(xù)指著小狗說(shuō):看這里有小狗。當(dāng)繩子釋放了的時(shí)候惹恃,不管有多少小孩子依舊在指著小狗說(shuō):看這里的小狗夭谤。小狗都會(huì)跑掉。
當(dāng)最后一個(gè)strong指針不再指向這個(gè)對(duì)象巫糙,這個(gè)對(duì)象就會(huì)被釋放朗儒,此時(shí)所有指向這個(gè)對(duì)象的weak指針都將被清空。
參考: