【问题标题】:mem allocation with imageNamed使用 imageNamed 分配内存
【发布时间】:2011-11-02 21:51:18
【问题描述】:

我想显示一些图像,当图像不可用时,我想显示默认图像。 使用分析功能时,我收到有关潜在泄漏的警告。 我明白当使用 imageNamed 时没有分配内存,有什么好的解决方法? 请参阅下面我的代码的一部分

if (!isMyFileThere){
    image = [UIImage imageNamed:@"default.png"];            
}
else{
    image = [[UIImage alloc] initWithContentsOfFile:pngFilePath];
}

【问题讨论】:

    标签: iphone imagenamed initwithcontentsoffile


    【解决方案1】:

    如果您希望对象在您手动释放之前一直保留,您应该使用保留,自动释放将对象添加到当前的 NSAutorelease 池中,该池在每次运行循环迭代结束时被耗尽。如果您尝试使用已释放的对象,您的程序将会崩溃。

    在 iOS 5.0 中,如果您启用 ARC,您将不再需要使用“retain”、“autorelease”或“release”。这些是由编译器自动添加的。

    【讨论】:

      【解决方案2】:

      image = [[UIImage alloc] initWithContentsOfFile:pngFilePath]; 你已经完成了一个分配,你现在必须释放它,如果你不这样做,这可能会导致泄漏。另一个语句是自动释放的对象。

      【讨论】:

        【解决方案3】:

        这是自动发布的

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

        这不是

        image = [[UIImage alloc] initWithContentsOfFile:pngFilePath];
        

        你需要这样做:

        image = [[[UIImage alloc] initWithContentsOfFile:pngFilePath] autorelease];
        

        规则是,如果您的方法名称以allocnewcopymuteableCopy 开头,则您拥有它并需要自己释放它,可以使用releaseautorelease。其他任何东西都不是你的,所以你不能释放它。

        如果你在一个对象上调用retain,你必须release(或autorelease)同样的次数:)

        【讨论】:

          猜你喜欢
          • 2013-10-26
          • 1970-01-01
          • 1970-01-01
          • 2014-05-16
          • 2017-11-02
          • 1970-01-01
          • 1970-01-01
          • 2016-11-24
          • 2012-06-10
          相关资源
          最近更新 更多