本文是本人多次面試跟面試官交流加上自己使用經(jīng)驗的心得體會!適合初級中級iOS開發(fā)工程師。看一遍就能完全理解的assign,retain和copy的區(qū)別,看完這篇文章搞定一切iOS面試
? ?assign:assign在修飾屬性的時候,主要用于基本數(shù)據(jù)類型,int,float等,與引用計數(shù)無關(guān),所以沒有引用計數(shù)的增加或減少,當(dāng)然assign也可以用于修飾對象,但是當(dāng)用來修飾對象的時候,若對象釋放掉了,其指針不會置為nil,weak會!
? ?舉個例子
? ? A *a=【【A alloc】init】;
? ? A *b=【a assign】;
此時a和b指向的是堆中同一塊內(nèi)存地址,a和b在棧中的地址也是一樣的,如果此時a不需要這個內(nèi)存了直接釋放掉,若b還在使用這塊內(nèi)存,就會crash!
? ? retain:retain會使引用計數(shù)增加1,假裝A *a=【【A alloc】init】;此時若有b=【a retain】;則a,b同時指向一塊內(nèi)存地址,此時對象的引用計數(shù)增加到2,如果此時釋放a,并不會造成程序的crash!此時ab所指向的堆中的內(nèi)存地址相同,但是ab在棧中的地址不同
? ?copy:a和b各有自己的內(nèi)存,a和b在棧中的地址不同,其所指向的堆中的內(nèi)存地址也不相同!
總結(jié):assign是一塊兒內(nèi)存,一個指針指向這塊內(nèi)存
retain是一塊內(nèi)存,兩個不同的指針指向這個內(nèi)存
copy是兩個不同的內(nèi)存,各有一個不同的指針指向著!
下面主題是深淺復(fù)制,有時間再寫