2010-08-23 39 views
0

它是安全的在Objective-C編寫的「self.propery = [[SomeClass alloc] init];」泄漏內存?

self.propery = [[SomeClass alloc] init]; 

代替

SomeClass *tmp = [[SomeClass alloc] init]; 
self.property = tmp; 
[tmp release]; 

或將第一種形式的內存泄漏?

+1

向我們顯示「屬性」的屬性聲明。這是'@ property'行。 – jer 2010-08-23 16:39:26

回答

5

第一個示例泄漏,除非您提供自定義屬性設置器。您可以使用:

self.propery = [[[SomeClass alloc] init] autorelease]; 

取而代之。

+0

謝謝。在NSAutoreleasePool發佈之前不會保留內存(即默認情況下,直到我退出應用程序)? – giorgiga 2010-08-23 17:08:24

+0

我的理解是,autorelease池通常會在每次執行「運行循環」後(應用程序退出之前)釋放。假設你正在編寫一個Cocoa或Cocoa Touch應用程序。 – 2010-08-23 19:05:32

0

第一個會泄漏。

當您不再需要它時,您必須發佈或自動發佈任何您[[ alloc] init]

請參閱此guide

2

這取決於如何定義屬性。如果它被定義爲保留或複製,那麼,是的,你的第一個例子會泄漏。

+0

如果@propriety與賦值,則它不會泄漏。確實如此。然而,如果它想在以後使用它(而不是你設置它的地方),保留這個價值是正當的責任。 – gcamp 2010-08-23 16:46:06

+0

財產有「保留」。 我有點希望有一種方法來分配一個新的對象的屬性沒有臨時變量 - 我太習慣使用垃圾回收器,可能(不,我不希望在我的應用程序 - 如果我要學習Objective-C,我會更好地吞下它)。 謝謝 – giorgiga 2010-08-23 17:02:06

0

無論您的財產是否定義爲保留,複製或分配,它都沒有什麼差別。當您使用[[SomeClass alloc] init]創建一個類的本地實例時,您有責任在它創建的範圍內發佈它。

凱文的回答是正確的。如果你不想創建,設置,釋放 - 你可以使用autorelease。主要的自動釋放池不時耗盡,你不會在應用程序的整個生命週期中使用該內存。

值得注意的是,autorelease池的不可預測性意味着您無法確定何時會釋放內存。如果在像iPhone這樣的內存受限的平臺上工作,您應該避免在必要的地方使用autorelease。