【问题标题】:Whats the correct way to alloc a UIImage to memory and release it iphone将 UIImage 分配到内存并在 iphone 上释放它的正确方法是什么
【发布时间】:2011-01-31 05:14:07
【问题描述】:

使用 Instruments,我不断被指向 UIImage 的内存泄漏。
我想我正在正确分配和释放内存。 Instruments 中泄露的对象被描述为 NSConcreteData

以下是分配和释放 UIImage 的正确方法吗?

UIImage* flagimg = [UIImage imageWithData: [NSData dataWithContentsOfURL:url2]];    
[flagimg release];
flagimg =nil;

【问题讨论】:

    标签: iphone memory-leaks uiimageview


    【解决方案1】:

    imageWithDatadataWithContentsOfURL 都返回自动释放的对象,因此您应该在该代码 sn-p 中没有内存泄漏。

    由于flagimg 是自动返回的,因此不需要您的[flagimg release]; 调用;你过度释放了那个对象。

    【讨论】:

      【解决方案2】:

      [UIImage imageWithData:] 返回一个自动释放的对象,你不应该再次释放它。所以这段代码不包含内存泄漏,而是相反,双重释放(在最坏的情况下)。

      请注意,Instruments 有时会在 Foundation 本身中产生误报和/或报告内存泄漏(是的,它们也会犯错误 :-)。

      分配/释放对象的最快方法是避免使用便捷初始化器(如 imageWithData:),而是使用类似

      NSData* data = [[NSData alloc] initWithContentsOfURL:url]];
      UIImage* img = [[UIImage alloc] initWithData:data];
      [data release];
      // use your image
      [img release];

      这将立即分配和释放您的对象,而不是等到清理自动释放池。

      但也请注意,内存泄漏通常不是没有释放的内存,而是丢失并且不能再释放的内存,所以一个对象将被自动释放池释放不被视为内存泄漏。

      【讨论】:

      • “双重释放”的后果是什么?
      • 通常是一个 EXC_BAD_ACCESS(通常称为 segfault),它会导致您的程序崩溃。如果您引用了已释放的对象并尝试访问它,也会发生这种情况。
      【解决方案3】:

      一般来说,你可以说

      如果你创建一个对象,其中有一个“init”、“copy”或“retain”,你必须释放它。 如果没有,你会得到一个自动释放的对象。

      这并不总是正确的,但在大多数情况下

      【讨论】:

        猜你喜欢
        • 2012-01-22
        • 2011-08-29
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        • 2013-08-05
        • 1970-01-01
        • 2015-12-17
        • 1970-01-01
        相关资源
        最近更新 更多