2011-09-05 50 views
14

維基百科陳述「在計算機編程中,弱引用是一種引用,它不保護引用的對象免受垃圾收集器的收集」。這兩種類型的引用在代碼中是如何看起來的?弱引用是否是由自動發佈的消息引用的引用?如何在Objective-C中看到弱和強的引用?

回答

16

以下答案適用於沒有垃圾回收的情況(例如在iOS上)。 在垃圾收集的情況下,實際上有一個關鍵字(__weak)用於創建弱引用。

「弱」參考是您不保留的參考。

您需要使用這些弱引用來分解循環。常見的情況是需要對其父對象進行引用的子對象。在這種情況下,父級將保留對子對象的引用,並且子對象具有對其父級的引用,但不保留它。這是有效的,因爲只要父對象有效,子對象只需要存在。

弱引用是否是自動發佈的消息引用的引用?

不是真的,這將是一個「非常弱引用」 ;-)

自動發佈的東西消失時,調用堆棧展開(在例如每個事件循環的結束)。如果你需要任何暫時性的東西,你需要保留一個參考文獻(或者像上面的情況一樣,確保其他部分能夠充分保留)。

+0

我最關心iOS SDK。關於iOS 4:那麼,如果沒有顯式保留消息,所有「賦值類型」屬性和任何其他一個obj指針的簡單賦值都應該被視爲弱引用? – Centurion

+1

是的。但請注意,像「alloc」這樣的方法包含一個隱含的「保留」。 – Thilo

+0

@Thillo如果我們使用屬性,'weak'與'assign'是否相同? –

6

弱引用是一個引用強度不足以強制對象留在內存中,而強引用則強制對象留在內存中。

如果你已經創建了任何變量的弱引用,你可能會得到零。

UITableViewDelegate,UIScrollViewDelegate等等都是弱引用的例子。強參考

例子:

MyClass *obj1 = [[Myclass alloc] init]; 

Myclass *obj2 = obj1; 

這裏obj2具有較強的參考obj1意思是,如果你從內存中刪除obj2然後obj1也移除。

+1

obj2是否真的對obj1有很強的參考?您聲明「弱引用是一個不足以強制對象留在內存中的引用」,並且查看您的示例,向obj1發送釋放消息不會阻止將obj1保留在內存中,因爲「 Myclass * obj2 = obj1;「賦值不會增加obj1上的保留計數。恕我直言,這是一個薄弱的參考。 – Centurion

+0

你能解釋一下我強烈的參考嗎? – Hitesh

+0

我想,第二個陳述「[obj2 retain];」會使其成爲一個有力的參考。是的,obj2只是一個指向obj1的指針,兩個都保留了計數屬於同一個對象分配在內存和恕我直言存儲在某處某處。但是每個+1保留計數都有一個所有者(至少理論上),對我來說,最好將該所有者視爲var/ivar/property,用於向目標發送顯式(保留)或隱式(alloc)保留消息目的。 – Centurion