Objective c 客观C记忆问题

Objective c 客观C记忆问题,objective-c,Objective C,如果我有一个视图控制器并按如下方式分配视图,是否存在泄漏: self.view = [[UIView alloc] initWithFrame:frame]; UIView *v = [[UIView alloc] initWithFrame:frame]; self.view = v; [v release]; 我是否需要这样做: self.view = [[UIView alloc] initWithFrame:frame]; UIView *v = [[UIView alloc] i

如果我有一个视图控制器并按如下方式分配视图,是否存在泄漏:

self.view = [[UIView alloc] initWithFrame:frame];
UIView *v = [[UIView alloc] initWithFrame:frame];
self.view = v;
[v release];
我是否需要这样做:

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

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

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

是的,这是一个漏洞。您的解决方案是正确的,或者您可以执行以下操作:

view = [[UIView alloc] initWithFrame:frame];
其中视图是一个实例变量。但这不是很好的做法。正如下面所评论的,在UIViewController视图中是一个超类属性,所以我的代码示例是错误的。但是,self.variable调用setVariable:,并遵守属性声明的retain样式的原则值得注意。在这种情况下,您可以直接分配给上面的实例变量,它省略了retain-并使这样的代码成为一个需要维护的恐惧,这就解释了为什么苹果的Objective C2.0属性语法糖没有得到普遍的赞赏


更正是因为格奥尔格完全正确。

是的,这是个漏洞。您的解决方案是正确的,或者您可以执行以下操作:

view = [[UIView alloc] initWithFrame:frame];
其中视图是一个实例变量。但这不是很好的做法。正如下面所评论的,在UIViewController视图中是一个超类属性,所以我的代码示例是错误的。但是,self.variable调用setVariable:,并遵守属性声明的retain样式的原则值得注意。在这种情况下,您可以直接分配给上面的实例变量,它省略了retain-并使这样的代码成为一个需要维护的恐惧,这就解释了为什么苹果的Objective C2.0属性语法糖没有得到普遍的赞赏


更正,因为Georg完全正确。

这取决于视图属性的声明。如果不是保留财产,那你就没事了。如果它是保留属性,则必须调用release。

这取决于视图属性的声明。如果不是保留财产,那你就没事了。如果它是保留属性,则必须调用release。

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


这里我们有alloc,它总是保持自身,所以您必须在某个地方释放对象。您可以在dealoc中或在将其分配给self.view后在此处执行此操作。

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

这里我们有alloc,它总是保持自身,所以您必须在某个地方释放对象。您可以在dealoc中或在将其分配给self.view后,在此处执行此操作。

您需要阅读

您使用+alloc获得对象。因此,根据规则,你有责任发布它。您自己的解决方案非常好,或者您可以:

self.view = [[[UIView alloc] initWithFrame:frame] autorelease];
你需要看报纸

您使用+alloc获得对象。因此,根据规则,你有责任发布它。您自己的解决方案非常好,或者您可以:

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

在目标c中,我们需要在目标完成后将对象的保留计数保持为零。因此,在代码中,必须释放对象。这样就不会产生任何泄漏问题


您指定的第二种方法是正确的。这不是强制性的,它是表示代码有效性的一种方式。

在目标c中,我们需要在对象达到目的后将其保留计数保持为零。因此,在代码中,必须释放对象。这样就不会产生任何泄漏问题


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

保留对象多于释放对象,其效果是永远不会释放对象,这称为内存泄漏。视图是UIViewController超类的属性。它不是该类中ivar的名称,因此代码不会编译ivar not视图的ISU视图。此外,您不应尝试分配给Apple的超类的ivar。保留对象多于释放对象会产生永不释放对象的效果,这称为内存泄漏。view是UIViewController的超类的属性。它不是该类中ivar的名称,因此代码不会编译ivar not视图的ISU视图。另外,你永远不应该尝试分配给苹果超级类的ivar。这是最好的解决方案,没有机会忘记释放对象。然而,在iPhone上不鼓励自动释放,因为它使用更多的内存,这在桌面上不是问题,但在iPhone上可能是问题。这是最好的解决方案,没有机会忘记释放对象。然而,在iPhone上不鼓励自动释放,因为它会占用更多的内存,这在桌面上不是问题,但在iPhone上可能是一个问题
克里希南:不,伊瓦尔不会被保留。是他们周围的访问者做的。因为属性通过访问器访问IVAR,它们甚至不再总是在那里,所以您通常不必关心内存管理。但是,属性可以定义为弱属性,在这种情况下,分配的对象不会被保留。@Gerog Scholly:我问这个问题的方式不对。我正在重新措辞。NSObject的任何子代中的所有属性都是这样吗?通常是这样,但属性可以定义为弱属性,在这种情况下它们不会被保留,但如果是这样,文档中会清楚地标记出来。这是任何控制器的所有iVars部分的情况吗?@Krishnan:不,iVars不会被保留。是他们周围的访问者做的。因为属性通过访问器访问IVAR,它们甚至不再总是在那里,所以您通常不必关心内存管理。但是,属性可以定义为弱属性,在这种情况下,分配的对象不会被保留。@Gerog Scholly:我问这个问题的方式不对。我正在重新措辞。NSObject的任何子代中的所有属性都是这样吗?通常是这样,但属性可以定义为弱属性,在这种情况下它们不会被保留,但如果是这种情况,文档中会明确标记。