如果我有一个视图控制器并像这样分配视图,它是否是泄漏:
self.view = [[UIView alloc] initWithFrame:frame];
我需要做这样的事情:
UIView *v = [[UIView alloc] initWithFrame:frame];
self.view = v;
[v release];
答案 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中,我们需要在其目的之后将对象的保留计数保持为零。所以在你的代码中你必须释放对象。然后它不会产生任何泄漏问题。
您指定的第二个是正确的方式。它不是强制性的,它是表达我们的代码有效性的方式。