Objective-C记忆问题

时间:2010-04-11 17:00:25

标签: objective-c

如果我有一个视图控制器并像这样分配视图,它是否是泄漏:

self.view = [[UIView alloc] initWithFrame:frame];

我需要做这样的事情:

UIView *v = [[UIView alloc] initWithFrame:frame];
self.view = v;
[v release];

6 个答案:

答案 0 :(得分:3)

是的,第二个。属性( self.view )通常保留其值。

答案 1 :(得分:2)

是的,这是泄漏。您的解决方案是正确的,或者您可以这样做:

view = [[UIView alloc] initWithFrame:frame];

其中view是实例变量。但这不是一个好的做法。如下面所述,在UIViewController视图中是一个超类属性,所以我的代码示例是双重错误的。但是,self.variable正在调用setVariable:并且将遵守属性声明的保留样式的原则值得注意。在这种情况下,你可以直接分配给上面的实例变量,这省略了retain - 并使这些代码成为一个恐怖的维护,这就解释了为什么Apple的Objective C 2.0属性语法糖并不普遍受到赞赏。

更正,因为Georg完全正确。

答案 2 :(得分:1)

这取决于view属性的声明。如果它不是(保留)财产,那么你没事。如果是保留属性,则必须致电release

答案 3 :(得分:1)

您需要阅读Cocoa Memory Management Rules

您使用+alloc获取了该对象。因此,根据规则,您有责任释放它。你自己的解决方案非常好,或者你可以做到:

self.view = [[[UIView alloc] initWithFrame:frame] autorelease];

答案 4 :(得分:0)

Objective-C内存管理有一个非常简单的规则。如果您已发送保留消息,则还要发送保留消息。我不知道这个规则的例外是SDK本身。

这里我们分配,发送保留自己(总是),所以你必须在某处释放对象。在将其分配给self.view之后,您可以在dealloc或此处执行此操作。

答案 5 :(得分:0)

在目标c中,我们需要在其目的之后将对象的保留计数保持为零。所以在你的代码中你必须释放对象。然后它不会产生任何泄漏问题。

您指定的第二个是正确的方式。它不是强制性的,它是表达我们的代码有效性的方式。