2010-04-07 51 views
0

我對理解這種情況有些困難。iPhone內存管理的模糊場景

  • 我創建了一個對象
  • 我所保留的屬性設置爲東西
  • 我忘記釋放其財產
  • 我釋放對象

,因爲我沒有鬆開財產在dealloc方法中,場景會導致內存泄漏還是會自動釋放該屬性?

回答

-1

是的,它是泄漏。

保留,alloc將增加一個計數器。 釋放將減少計數器。 當計數器達到零時,它將釋放內存。

思考設定器中,這樣:

[newvalue retain]; 
[property release]; 
property = newvalue; 

所以..

  • 創建一個對象=> 0 + 1 = 1
  • 其分配給一些對象作爲保留屬性=> 1 + 1 = 2
  • 釋放對象=> 2-1 = 1

您將不得不再次釋放該對象。 而且,相信我autorelease在iphone環境下工作不太好。

+1

這是不正確的,autorelease的確在iPhone上工作。 – Ken 2010-04-07 09:08:10

+0

少量的自動釋放對象可以。但是,我仍然建議你應該避免使用它。 你可以在dealloc func 中釋放屬性,因爲'[nil release]'不會給你帶來任何麻煩。 – Bird 2010-04-07 09:38:13

0

可可的工作方式是內存管理總是在本地看起來平衡,在任何一個方法*。這是一個重點。通過查看這種方法,您應該能夠判斷出方法中是否存在泄漏或錯誤。沒有全球程序知識要求。

如果您從-copy,-alloc,-retain或-new方法接收到對象,則您有責任釋放對象。

如果你這樣做:

[obj setProp:foo]; 

是你的責任,以釋放富?否 - 查看規則。如果obj保留它(並且你說你碰巧知道它的確如此),那麼obj有責任在它的dealloc方法中釋放它,如果不是更早的話。

所以,如果你這樣做,它是平衡的,不管是什麼樣的財產-prop是。

id obj = [[MyObject alloc] init]; 
[obj setProp:foo]; 
[obj release]; 

*除了在init,copy,dealloc和accessor方法的實現中。