維基百科陳述「在計算機編程中,弱引用是一種引用,它不保護引用的對象免受垃圾收集器的收集」。這兩種類型的引用在代碼中是如何看起來的?弱引用是否是由自動發佈的消息引用的引用?如何在Objective-C中看到弱和強的引用?
回答
以下答案適用於沒有垃圾回收的情況(例如在iOS上)。 在垃圾收集的情況下,實際上有一個關鍵字(__weak
)用於創建弱引用。
「弱」參考是您不保留的參考。
您需要使用這些弱引用來分解循環。常見的情況是需要對其父對象進行引用的子對象。在這種情況下,父級將保留對子對象的引用,並且子對象具有對其父級的引用,但不保留它。這是有效的,因爲只要父對象有效,子對象只需要存在。
弱引用是否是自動發佈的消息引用的引用?
不是真的,這將是一個「非常弱引用」 ;-)
自動發佈的東西消失時,調用堆棧展開(在例如每個事件循環的結束)。如果你需要任何暫時性的東西,你需要保留一個參考文獻(或者像上面的情況一樣,確保其他部分能夠充分保留)。
弱引用是一個引用強度不足以強制對象留在內存中,而強引用則強制對象留在內存中。
如果你已經創建了任何變量的弱引用,你可能會得到零。
UITableViewDelegate
,UIScrollViewDelegate
等等都是弱引用的例子。強參考
例子:
MyClass *obj1 = [[Myclass alloc] init];
Myclass *obj2 = obj1;
這裏obj2
具有較強的參考obj1
意思是,如果你從內存中刪除obj2
然後obj1
也移除。
obj2是否真的對obj1有很強的參考?您聲明「弱引用是一個不足以強制對象留在內存中的引用」,並且查看您的示例,向obj1發送釋放消息不會阻止將obj1保留在內存中,因爲「 Myclass * obj2 = obj1;「賦值不會增加obj1上的保留計數。恕我直言,這是一個薄弱的參考。 – Centurion
你能解釋一下我強烈的參考嗎? – Hitesh
我想,第二個陳述「[obj2 retain];」會使其成爲一個有力的參考。是的,obj2只是一個指向obj1的指針,兩個都保留了計數屬於同一個對象分配在內存和恕我直言存儲在某處某處。但是每個+1保留計數都有一個所有者(至少理論上),對我來說,最好將該所有者視爲var/ivar/property,用於向目標發送顯式(保留)或隱式(alloc)保留消息目的。 – Centurion
- 1. 強和弱引用
- 2. 弱引用和強引用
- 3. 我不明白強和弱引用
- 4. 瞭解弱與強引用
- 5. 如何將弱引用改爲強引用?
- 6. ARC的所有權與強,弱引用
- 7. 軟引用和弱引用
- 8. 強和弱事件
- 9. 當iOS中使用強和弱引用5
- 10. FieldBinding和弱引用
- 11. iVars引用強,弱或什麼?
- 12. 自定義UITableViewCells UITextField強或弱引用?
- 13. 從ObjectiveC類中引用UIViewController
- 14. IBOutlet和其他弱或強
- 15. 弱引用和匿名類
- 16. ActionScript和弱引用行爲
- 17. Java中的HashMap如何處理鍵和值的弱引用?
- 18. iOS中的強弱混淆
- 19. 在Java EE編程中使用弱引用和軟引用
- 20. 有沒有辦法將弱引用變成強引用?
- 21. Perl中的弱引用
- 22. python中的弱引用
- 23. clojure中的弱引用
- 24. 弱/強註解
- 25. 如何清理弱引用的集合?
- 26. 弱引用是如何實現的?
- 27. Lua弱引用
- 28. 弱引用值的弱散列表?
- 29. 在C回調中的ARC弱引用
- 30. 強制LD解決在LD時弱引用
我最關心iOS SDK。關於iOS 4:那麼,如果沒有顯式保留消息,所有「賦值類型」屬性和任何其他一個obj指針的簡單賦值都應該被視爲弱引用? – Centurion
是的。但請注意,像「alloc」這樣的方法包含一個隱含的「保留」。 – Thilo
@Thillo如果我們使用屬性,'weak'與'assign'是否相同? –