XCode4.2下的物件參照 weak and strong

Strong 與 Weak
  • Strong 的參考上是參考到一個物件一直到當該物件被 deallocted,也就是會幫我們創建出彼此的關聯性,創建彼此的擁有權生命週期。 
  • Weak 的參考上是一直對應到該物件,就算這個物件被 dealloc 了還是存在。因此它不會創建擁有權。
  • _strong 是預設值,因此不打出來就是這樣的方式,創建了物件就會幫忙處理全部的 retained 和 released,本身內部這個物件使用。
  • _weak 表明這個物件能夠隨時不見都沒有關係,若是對應到某個物件就算被 dealloc 它就會變成 nil 。
  • unsafe_unretained 這是跟 weak 一樣,可是當物件被 dealloc 不會將指標變成 nil。只是會變成指到無效的物件。
  • _autoreleasing 這會指引到該物件並且創建 autorelease 關係。

原文參考
http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

此處還需另外參考ARC Overview

strong也就是咱們一般所講的引用,其存亡直接決定了所指對象的存亡。若是不存在指向一個對象的引用,而且此對象再也不顯示列表中,則此對象會被從內存中釋放。
  weak除了不決定對象的存亡外,其餘與強引用相同。即便一個對象被持有無數個若引用,只要沒有強引用指向他,那麼其仍是會被清除。沒辦法,仍是 「強哥」 有面子。

只要沒有strong pointer 指到的物件就會被清除。


簡 單說來,在XCode4.2的機制下物件有分為兩種,一種是weak的參照,一種是strong的參照。weak的參照就像是通常的C下面的記憶體參照, 純粹就是一個記憶體的指標,指向一個記憶體中的物件。同時在自動的參照記數下,若是它所指向的物件在空間中的被移除配置(deallocate)了之後, 它的值也會被設成nil,這樣纔不會變成一個指向不合法空間的指標。所以你能夠想像這種weak的用法就像是之前的assign,只是現在的記憶體管理機 制會幫你把這個變數的參照設定成nil。

而相較於weak,strong所表明的就像是我們所熟悉的retain,所以你能夠確保這個成員變數在它的母物件還沒有被釋放前都是依然有效的。

其中strong,通過pointer,將資料放在堆疊中,而不是放在通常的記憶體中。若是pointer改指向nil,計數就會減一。或是將資料從堆疊中取出,計數也會減一。

在記憶體管理中,會有一個計數器計數堆疊數,當計數回到0的時候就會釋放記憶體。  
通常的local variables就是strong pointer


weak只在iOS5下面起做用,iOS4不會將pointer自動歸0,所以只能用 strong,手動將它歸到0。




strong/weak 是 ARC 用的,retain/copy/weak 是 non-ARC 用的。
strong, retain, copy 都是說我對這個 property 有 ownership。例如一個 Person Class 有 name property 就是有 ownership。retain 和 copy 是說,當你用 setter 時,採用的是 retain 或者是 copy。用 copy 的時機是避免 mutability,例如說 obj.name = aMutableString; [aMutableString truncate]; 我們設定了 name 以後,別人不當心在外面動到 mutable string,竟然把我這個 object 的名字也改掉了,因此我們但願 copy 一份讓別人不要動到。而 strong 算是新一代的宣示,他就是「我有 ownership」,至於細節怎麼處理,就是由 compiler ARC 去作了。
weak 或 assign 則是我對此 property 沒有 ownership。例如 delegate 一般都用 weak/assign。因為一個搞很差很容易變成 retain cycle,就會有 memory leak。weak 還有個好處,就是當被指到的對象 dealloc'd 時會自動 zeroing property。
至於那段話意思是說,假設你 synthesize 一個 NSArray property 好了,他只是會幫你生一個 NSArray * pointer,實際上這 pointer 的值還是 nil,你要產生真正能夠用的 NSArray instance 要本身去 create。
就好像 NSArray *a = nil; a = [NSArray new]; 這 synthesize 幫你產生前半句,後半句你要本身作的意思。


轉貼自
  http://www.runpc.com.tw/content/content.aspx?id=108343
http://ask.inside.com.tw/questions/98-ios5-%E4%B8%AD-property%E7%9A%84%E5%AE%A3%E5%91%8A%E6%9C%89%E6%B2%92%E6%9C%89%E6%9B%B4%E6%B8%85%E6%A5%9A%E7%9A%84%E8%AA%AA%E6%B3%95
相關文章
相關標籤/搜索