關(guān)于IOS屬性關(guān)鍵字的一些理解和筆記,對于weak,strong,assign,nonatomic,natomic等的一些思考,如有錯(cuò)誤之處,請指正!
原子性:natomic
該屬性為默認(rèn)屬性,在多線程操作下,一個(gè)實(shí)例變量在某一時(shí)刻,只有一個(gè)線程訪問 。即變量的存取是互斥鎖定的。(不一定線程安全)非原子性: nonatomic
nonatomic特質(zhì)的變量可以直接返回值,不受線程的影響,所以在執(zhí)行效率上更快。讀/寫權(quán)限:readwrite(讀寫)、readonly (只讀)
從字面上就能理解readonly值具有g(shù)et方法,readwrite具有g(shù)et和set方法。
下面的內(nèi)存管理語義才是重點(diǎn)!!
-
retain :
使引用計(jì)數(shù)加1(MRC環(huán)境下,相當(dāng)于ARC環(huán)境下的Strong,對MRC有畏懼感,不是很了解) -
assign(基本數(shù)據(jù)類型默認(rèn)關(guān)鍵字):
直接賦值,適用于基本數(shù)據(jù)類型(bool,int,cgfloat等),不會使retainCoun加1,只是簡單的賦值。(在MRC和ARC的環(huán)境下,都是使用默認(rèn)assign修飾基本數(shù)據(jù)類型) -
strong :
每次對屬性引用,retainCount都會加1,不用能與修飾基本數(shù)據(jù)類型,是NSObject和id的默認(rèn)修飾符。 -
weak:
不會使retainCount增加,只用于修飾NSObject,不能用于修飾基本數(shù)據(jù)類型。(delegate和控價(jià)都推薦使用weak,防止循環(huán)引用)在對象被銷毀以后,指針指向nil。 -
copy:
建立一個(gè)索引計(jì)數(shù)為1的對象,在賦值時(shí)使用傳入值的一份拷貝。這里分為深拷貝和淺拷貝(block建議使用copy,block建立的時(shí)候是放在棧上的,調(diào)用完畢以后就會被銷毀,使用copy將其放在堆上,只有在對象銷毀的時(shí)候才會銷毀)
深拷貝:淺拷貝類似retain,引用計(jì)數(shù)對象+1.創(chuàng)建一個(gè)指針。也就是說,不僅改變值,還改變指正指向的內(nèi)存地址;
淺拷貝:只改變指針指向的地址。即只拷貝了原對象的指針。
weak和assign的區(qū)別
weak 和 assign 最大的區(qū)別在于,weak修飾的屬性指向的對象被銷毀后自動指向nil,再向weak修飾的屬性發(fā)消息的時(shí)候,不會造成野指針,防止carh。并且weak只能修飾對象,assign修飾基本數(shù)據(jù)類型。