NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室兩廳']; 安全
上面一段代碼會執行如下兩個動做:
1 在堆上分配一段內存用來存儲@' MM的三室兩廳 ' ,好比:內存地址爲 0X1111 內容爲 ' MM的三室兩廳' ,
2 在棧上分配一段內存用來存儲 houseForWife ,好比:地址爲 0XAAAA 內容天然爲 0X1111
下面分別看下(assign,retain,copy):
1.assign的狀況: NSString * myHouse = [ houseOfMM assign ];
此時 myHouse 和 houseOfMM 徹底相同,地址都是 0XAAAA ,內容爲 0X1111 ,即 myHouse 只是 houseOfMM 的別名,對任何一個操做就等於對另外一個操做。所以 retainCount 不須要增長.(同進同出,關係好,一把鑰匙,給我拿着)
2.retain的狀況: NSString * myHouse = [ houseOfMM retain ];
此時 myHouse 的地址再也不爲 0XAAAA ,可能爲 0XAABB ,可是內容依然爲 0X1111 .所以 myHouse 和 houseOfMM均可以管理' 裝梵幾的三室兩廳 '所在的內存。所以 retainCount 須要增長1.(有些獨立,各自進出,兩把鑰匙)
3.copy的狀況: NSString * myHouse = [ houseOfMM copy ]; 多線程
此時會在堆上從新開闢一段內存存放@'MM的三室兩廳',好比0X1122,內容爲@'MM的三室兩廳',同時會在棧上爲myHouse分配空間,好比地址:0XAACC,內容爲0X1122,所以retainCount增長1供myHouse來管理0X1122這段內存.(兩套@'裝梵幾的三室兩廳',條件好,分居了,房子一人一套,因此鑰匙一人一把。) post
何時用assign,固然是破房子,簡裝的房子拉
基礎類型(簡單類型,原子類型):NSInteger,CGPoint,CGFloat,C數據類型(int,float,double,char等)
何時用copy
含有可深拷貝的mutable子類的類,如NSArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet,NSString
(可深度拷貝的房子)
可是NSMutableArray這樣的不能夠,Mutable的不能用copy,否則初始化會有問題。切記
何時用retain
其餘NSObject和其子類對象好嘛 (大多數)
ARC中的strong至關於非ARC中的retain,ARC來了之後多搞一把鑰匙就strong了啦。 atom
以上內容參考原地址爲:點這裏線程
weak:由ARC引入的對象變量的屬性,比assign多了一個功能,對象消失後把指針置爲nil,避免了野指針(不是null指針,是指向「垃圾」內存(不可用的內存)的指針)指針
nonatomic
指出訪問器不是原子操做,而默認地,訪問器是原子操做。這也就是說,在多線程環境下,解析的訪問器提供一個對屬性的安全訪問,從獲取器獲得的返回值或者經過設置器設置的值能夠一次完成,即使是別的線程也正在對其進行訪問。若是你不指定nonatomic,在本身管理內存的環境中,解析的訪問器保留並自動釋放返回的值,若是指定了nonatomic,那麼訪問器只是簡單地返回這個值。htm