【问题标题】:Release a retain UIImage property loaded via imageNamed?释放通过 imageNamed 加载的保留 UIImage 属性?
【发布时间】:2010-12-02 18:09:12
【问题描述】:

在我的类对象中,我为UIImage 定义了一个(nonatomic, retain) 属性。 我为这个属性分配了一张通过

加载的图片
[UIImage imageNamed:@"file.png"];

如果在某个时候我想将此属性重新分配给另一个图像,我是否必须释放先前的引用?

我很困惑,因为我知道我应该释放它的保留属性。 但是因为imageNamed: 是一种方便的方法(不使用alloc),我不确定在这里应用什么规则。

感谢您的洞察力!

【问题讨论】:

    标签: iphone uiimage release retain


    【解决方案1】:

    正确,弗洛林...但根据上面的讨论,如果使用 setter 设置(通过合成或手动)执行“保留”的属性,则不需要额外的保留。

    换句话说,以下是正确的(并且没有内存泄漏),恕我直言,对吗?我认为这是问题的初衷......我也想确定。 ;-) 谢谢!

    @interface MyClass {
        UIImage *myImage;
    }
    @property (nonatomic, retain) UIImage *myImage;
    @end
    
    @implementation MyClass
    @synthesize myImage;
    
    - (void) someMethod {
    
        self.myImage = [UIImage imageNamed:@"foo.png"];
    }
    
    - (void) someOtherMethod {
    
        self.myImage = [UIImage imageNamed:@"bar.png"];
    }
    
    - (void) dealloc {
    
        self.myImage = nil;
        [super dealloc];
    }
    @end
    

    【讨论】:

    • 这是正确的。使用self.myImage = someImage 调用setter 方法,它会为您保留它。 AND [UIImage imageNamed:] 返回一个自动发布的图像,这意味着您不必在它之后进行清理。
    【解决方案2】:

    图像会根据命名规则自动发布给您。通过设置器将其分配给具有保留属性的属性将保留它。通过 setter 将另一个图像分配给属性将释放旧图像并保留新图像。

    【讨论】:

      【解决方案3】:

      当您使用 nonatomicretain 定义属性时,它会为您创建一个如下所示的 setter:

      -(void)setImage:(UIImage*)newImage {
        if (image != newImage) {
          [image release];
          image = [newImage retain];
        }
      }
      

      如您所见,它在保留新值之前释放了先前的值。

      在您的特定情况下,-[UIImage imageNamed:] 返回的自动释放图像将在您将其分配给属性时自动保留,然后在您将另一个图像(或nil)分配给属性时自动释放。

      【讨论】:

        【解决方案4】:

        来自docs

        ...如果您打算保留返回的图像对象,则必须像保留任何 Cocoa 对象一样保留它。

        这意味着如果你不想再持有它,你应该释放它(假设你已经保留了它)。

        【讨论】:

          【解决方案5】:

          你应该释放你保留的所有对象,但是当你定义你的图像对象时,我相信你的代码应该是这样的:

          UIImage *img = [[UIImage imageNamed:@"file.png"] retain];
          

          【讨论】:

            猜你喜欢
            • 2011-02-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-03-18
            • 2012-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多