这个变量应该手动释放吗?

Posted

技术标签:

【中文标题】这个变量应该手动释放吗?【英文标题】:Should this variable release manually? 【发布时间】:2011-05-12 15:04:51 【问题描述】:

分配、保留和复制需要释放内存。我的问题是针对以下情况,我保留了 UIImage 属性,但它是由 imagedNamed 的功能自动释放的。我还应该释放以下变量吗?

@property (nonatomic, retain) UIImage *image;
self.image = [UIImage imageNamed:@"image.png"];

谢谢!

【问题讨论】:

我猜你编辑了这个来解决这个问题。现在下面的答案没有意义。这使得其他人很难跟随和学习。你的原始代码是这样的吗? [self image] = [UIImage imageNamed:@"image.png"]; 【参考方案1】:

在您的代码中,您不使用您的属性,而是将自动释放的 UIImage 对象直接分配给您的 iVar,因此您需要

    保留您的图像(或更好地实际使用属性) - 否则当您退出当前范围时您的图像对象将被销毁,并且以其他方法访问它会导致错误。所以使用:

    self.image = [UIImage imageNamed:@"image.png"];
    

    在 dealloc 方法中释放你的图像

【讨论】:

对不起。 self.image 输入错误。【参考方案2】:

是的,您必须发布图像,因为您保留了它。

【讨论】:

但他访问的是 ivar,而不是属性。所以不会调用retain。 对。它是一个自动释放对象。您需要担心只释放那些您分配或保留的对象。在您的示例中,如果您说 self.image = [UIImage imageNamed:@"image.png"];然后它被保留,因为它的属性被访问。如果你不像你的例子那样说 self.image,你就没有保留它。 仍然需要执行 self.image = nil 和 [image release]。所有保留的属性都必须在 dealloc 中释放。 @jini:在 dealloc 中不必同时执行 self.image = nil[image release]。第一个将使第二个无关紧要。 是的,但如果你这样做self.image = nil,那么image 为零。 [nil release] 绝对什么都不做。因此,self.image = nil; [image release];self.image = nil; 完全相同

以上是关于这个变量应该手动释放吗?的主要内容,如果未能解决你的问题,请参考以下文章

在opencv中 我新建了一个Mat 类型的变量,怎么释放他??如下。

我必须释放这个变量吗?

我应该总是为失败的初始化方法释放自我吗?

javascript 释放变量

堆和栈的区别

java在循环语句的执行语句赋予变量值循环结束后会释放吗?