2010-08-23 43 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。