簡體   English   中英

ios 對強/弱引用感到困惑

[英]ios confused about strong/weak references

我查看了有關強/弱引用的問題,並了解使用弱(父子關系)的原因。 但是,我對創建父子關系的特定場景感到困惑。

例如,是否將子視圖添加到 UIView 對象...創建父/子關系的示例? 什么是?

到目前為止,我在我的項目中使用strong 做了所有事情,我沒有使用過weak,但我不確定我是否會遇到內存管理問題(或者如何檢查我是否會遇到)。

任何人都可以提供創建父子關系的具體情況或示例嗎?

謝謝!

編輯:事實上,我在一個顯示大量數據(地圖視圖、圖像數量、文本、按鈕)的 ViewController 中遇到了一些“收到的內存警告”問題。 所有屬性都有一個強指針。 我需要修復這個 ViewController 的內存管理問題

你的理解是倒退的。 弱引用更常用於實現子父關系。 對於父母與孩子的關系,它們很少有意義。 通常父母擁有孩子; 這意味着強大。

絕大多數情況下,您需要一個強有力的參考。 這就是為什么它是默認值。 沒有強引用的最常見原因是它是否會導致保留循環。 例如,如果 A 對 B 有一個強引用,那么如果 B 對 A 有一個強引用,你就會有一個循環,並且兩個對象都不會被釋放。 因此,您選擇其中一個對象作為所有者,並且它具有強引用。 另一個對象具有弱引用。

最常見的情況是委托。 委托幾乎總是擁有它所委托的東西。 所以委托對象應該有一個對委托的弱引用。 作為Objective-C 中的約定,一個名為delegate的屬性應該是弱的。 (如果這感覺倒退,請考慮在實踐中如何使用UITableViewUITableViewDelegate ,以及您希望將哪一個視為“所有者”。)

弱委托指針不是硬性規定。 有一些例外,例如NSURLConnection 如果委托對象的生命周期比委托對象的生命周期短,那么它可以(並且通常更可取)保持強引用。

“收到內存警告”不一定與內存管理有關。 這只是意味着您使用了太多內存。 如果您有保留循環,那么您可能會泄漏內存,這將導致此警告。 但這也可能是因為您只是使用了太多內存。 Instruments 中的“分配”工具是對此進行調查的最佳方法。

雖然“強”和“弱”的實現是最近添加到 Objective-C 的,但它們只是形式化並為正確編寫的代碼多年來使用手動保留所做的事情提供了更好的語言支持。 今天的所有權模式與 ARC 之前的所有權模式相同。

有些人整理了一個非常有用的圖表,解釋了何時在“一起編碼”Piazza 類上使用弱引用。 它有一些很好的圖表,用強/弱指針解釋了基本的內存管理。

http://piazza-uploads.s3-website-us-east-1.amazonaws.com/attach/h3ex5vh7htrh9/h4777mrpwp17bg/h4777tczi147de/Views,%20Outlets,%20Weak%20References.pdf

當您向視圖添加子視圖時,父視圖將在幕后保留其子視圖。 是的,這是父子關系。 如果您正在創建自己的 UIView 子類,您也會這樣做。

父母與孩子的關系很牢固,但孩子永遠不應該對父母有很強的關系。 這可能導致保留循環,其中任何一個都不能被釋放,因為它們彼此之間有很強的聯系。

Strong 是默認設置,當您使用委托模式時,您會傾向於使用 weak。

也許您應該發布有關您收到的內存警告問題的更具體的信息,因為這個問題是關於內存語義的非常普遍的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM