2010-04-13 72 views
1

我有一些代碼,我認爲有額外的發佈聲明。發佈前沒有保留危險嗎?

  1. 代碼不正確?
  2. 最終結果是什麼?

我不明白內存管理 - 甚至在閱讀大量的文章和stackoverflow的答案。感謝您的理解。

更新:所附的片段工作正常,但其他的代碼有過放的問題

NSMutableArray *points = [NSMutableArray new]; 
for (Segment *s in currentWorkout.segments) { 
[points addObjectsFromArray:[s.track locationPoints]]; 
} 
[routeMap update:points]; 
[points release]; 

回答

5

沒有消息可以安全地發送到解除分配的對象。一旦一個對象被釋放了足夠的次數,它就會被釋放。發送到該對象的任何進一步的消息將轉到不存在的對象。確切的結果不是完全可預測的,但通常以崩潰結束。如果你不那麼幸運,它可能以非常陌生的方式結束 - 例如,你可以理論上結束對象A的早期處理,並將對象B分配到同一個內存位置,然後對象B接收對象A的消息,對象B確實瞭解,但不應該在當時收到。

基本上,follow the rules。從所有權角度考慮它。如果您聲明擁有權,則需要釋放該所有權。如果你沒有自己的對象,你一定不要釋放它。

+0

你說的是真的,但OP沒有過度釋放他的陣列。 – 2010-04-13 17:51:27

+0

這是真的 - 我給出的鏈接也是如此。 – Chuck 2010-04-13 18:19:39

0

看看這篇文章在網上:http://weblog.bignerdranch.com/?p=2

它似乎意味着調用釋放沒有相應的preior調用保留將導致BAD_ACCESS錯誤。

+0

您還需要知道對象何時保持計數增加(這不僅僅是在您調用保留時)新分配的對象返回的保留計數爲+1 – Daniel 2010-04-13 15:39:22

0

一個簡短的回答是,如果你增加了保留對象的數量和你不再使用它,你應該釋放它,否則你不應該...

所以,當你永遠做一個[對象名頁頭]當你使用[NSString stringWithString:]這樣的方法時,你正在增加1,這些方法返回一個自動釋放的對象,所以你不需要釋放它...如果你改爲做[[NSString stringWithString:] retain],那麼你正在增加字符串保留計數,你應該在完成使用後釋放它。

我不太確定,如果新增了引用計數(我懷疑它會),您可以隨時通過[對象retainCount]檢查您的保留計數...但請注意,即使保留計數大於0 ,這並不意味着你需要釋放該對象,因爲其他一些類可能有一個對該對象的引用,因此它的保留計數增加1,而其他類的責任持有引用來釋放它。

希望這有助於

+0

+ new s不是關鍵字。這是一種方法,它被記錄。它與調用alloc和init是同義詞,意味着保留。這個答案有點意味深長;我建議閱讀cocos內存管理指南,因爲它很清楚。 – bbum 2010-04-13 18:27:36

0

你應該使用:

NSMutableArray *points = [[NSMutableArray alloc] init]; 
[...] 
[routeMap update:points]; //if routemap stores the points, it will need it's own release retain 
[points release]; //if there is a retain in the method above, reference will not be cleared 

如果不確定,使用建設 - > analyze命令,它會搜索你的代碼泄露refrences

你可以得到官方內存管理指南http://www.devworld.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.pdf

+0

分析經常出錯,我不會依賴它。 – 2010-04-13 15:44:27

+0

是的,但它是進一步挖掘的好起點。 – 2010-04-14 08:21:35

6

您的代碼是正確的,但不可取。作爲隱含分配的新行爲,其創建保留計數爲1的對象。

我認爲我最後一次使用new是在1992年;這沒有錯,但是alloc/init被認爲是更好的練習,因爲它更清楚你正在做什麼。請閱讀Apple's guide to memory management,這是一個全面的情況總結。

+1

Alloc/init在實踐中並不被認爲更好。使用+ new沒有任何問題。 – bbum 2010-04-13 18:28:42

+0

嗨比爾。使用新的並不是一個錯誤,它的工作原理 - 但它會混淆新手,證明這是最初的問題。 – 2010-04-13 19:24:02

+0

好吧,它不應該混淆。在內存管理規則中特別提到了+ new。如果你知道他們 - 而且你應該 - 你知道+ new讓你擁有返回的對象。 – JeremyP 2010-04-13 20:00:39