#系列:iOS開發-strong 、weak、copy 、assign 、retaingit
不管是在iOS開發剛學習的時候,仍是在平常的開發中,咱們都須要建立的對象,對應的咱們就會有設置對象的類型的必要. 這個並非說設置了就完事了,爲何咱們要用strong 、weak、copy 、assign 、retain等這些不一樣的修飾詞類定義對象呢? 說白了就是爲了內存管理. 內存管理是咱們作開發的所必需要時刻關注的問題. 好在iOS開發通過這麼久的發展,已經通過了MRC的時代.如今的ARC時代系統自動管理內存,讓咱們省掉了不少事情,可是咱們仍然的要關注,咱們須要在適當的地方使用適當的類型,避免形成沒必要要的內存消耗,或者循環引用等問題.github
copy: 用於但願保持一份傳入值的拷貝,而不是值自身的狀況,即把原來的對象完整的賦值到另一地方,從新加載一內存區,一個地方變了不影響另外一個地方的對象。 assign: 簡單的直接賦值,至關於說兩個對象指向同個內存區,一個地方的變了,其餘的也跟着改變。 retain:釋放舊的對象,將舊對象的值賦予輸入對象,再提升輸入對象的索引計數 爲1 strong 用來修飾強引用的屬性;相似於對應原來的retain或者copy weak 用來修飾弱引用的屬性;相似於對應原來的assign函數
copy與retain: 一、copy實際上是創建了一個相同的對象,而retain不是; 二、copy是內容拷貝,retain是指針拷貝;
三、copy是內容的拷貝 ,對於像NSString,的確是這樣,可是若是copy的是一個NSArray呢?這時只是copy了指向array中相對應元素的指針.這即是所謂的"淺複製". 四、copy的狀況:NSString *newPt = [pt copy]; 此時會在堆上從新開闢一段內存存放@"abc" 好比0X1122 內容爲@"abc 同時會在棧上爲newPt分配空間 好比地址:0Xaacc 內容爲0X1122 所以retainCount增長1供newPt來管理0X1122這段內存;學習
assign與retain: 一、assign: 簡單賦值,不更改索引計數; 二、assign的狀況:NSString *newPt = [pt assing]; 此時newPt和pt徹底相同 地址都是0Xaaaa 內容爲0X1111 即newPt只是pt的別名,對任何一個操做就等於對另外一個操做, 所以retainCount不須要增長; 三、assign就是直接賦值; 四、retain使用了引用計數,retain引發引用計數加1, release引發引用計數減1,當引用計數爲0時,dealloc函數被調用,內存被回收;
五、retain的狀況:NSString *newPt = [pt retain]; 此時newPt的地址再也不爲0Xaaaa,可能爲0Xaabb 可是內容依然爲0X1111。 所以newPt 和 pt 均可以管理"abc"所在的內存,所以 retainCount須要增長1 ;.net
assign與weak: 一、assign修飾的是基本數據類型,weak修飾的是對象類型 二、weak比assign多了一個功能就是當屬性所指向的對象消失的時候(也就是內存引用計數爲0)會自動賦值爲nil,這樣再向weak修飾的屬性發送消息就不會致使野指針操做crash,而assign並不會賦值nil,也就是咱們一般說的野指針 三、在MRC時代,咱們使用代理的時候是使用的assign,ARC的時代咱們更傾向於你使用weak,代理
strong與weak: 一、strong與weak是由ARC新引入的對象變量屬性 ARC引入了新的對象的新生命週期限定,即零弱引用。若是零弱引用指向的對象被deallocated的話,零弱引用的對象會被自動設置爲nil。 二、一般咱們手動建立一個對象的時候咱們會在vc中建立一個strong類型的對象, 表示當前的vc的類的對象擁有這個小的對象,這樣其能夠對該對象保持全部權,該對象的修改乃至銷燬都由當前的vc來決定,當vc不存在的時候對象也會被釋放 三、咱們會在使用xib或者storyboard的時候,拖出來的是一個weak類型的對象,事實上IBOutlet的屬性通常能夠設爲weak是由於它已經被view引用了,除非view被釋放,不然IBOutlet的屬性也不會被釋放,另外IBOutlet屬性的生命週期和view應該是一致的,因此IBOutlet屬性通常設爲weak。 四、在ARC的項目中,咱們絕大部分看到的都是strong和weak修飾數據類型,咱們更少的管理對象的內存釋放問題.可是咱們必須注意,好比一個NSTimer對象,一般咱們使用strong,可是咱們若是使用不當,咱們就會形成其沒法釋放,從而致使vc沒法釋放的問題,這個你能夠查找一些資料看看 五、在使用block的時候咱們也會遇到循環引用致使的沒法釋放的問題 例如vc中有一個block,在block中直接調用vc中的一個對象.就會形成循環引用. 咱們須要學會使用弱指針 __weak 來解決,後續的博客會單獨介紹 六、strong強引用也就是咱們一般所講的引用,其存亡直接決定了所指對象的存亡。若是不存在指向一個對象的引用,而且此對象再也不顯示列表中,則此對象會被從內存中釋放。 七、weak弱引用除了不決定對象的存亡外,其餘與強引用相同。即便一個對象被持有無數個若引用,只要沒有強引用指向他,那麼其仍是會被清除。沒辦法,仍是 「強哥」 有面子。指針
strong與retain: 一、聲明屬性時用strong或者retain效果是同樣的(貌似更多開發者更傾向於用strong) 二、在聲明Block時,使用strong和retain會有大相徑庭的效果。strong會等於copy,而retain居然等於assign! 三、定義Block仍是應該用copy由於非ARC下不copy的Block會在棧中,ARC中的Block都會在堆上的。對象
暫時只想到這麼多,後續會繼續添加blog
Demo地址:github.com/spicyShrimp…索引
系列:iOS開發-前言+大綱 blog.csdn.net/spicyShrimp…