【问题标题】:IPHONE: Question about releasing a variableIPHONE:关于释放变量的问题
【发布时间】:2025-08-08 12:00:01
【问题描述】:

考虑这个伪代码:

// an image is initialized
UIImage *imagePX = [[UIImage alloc]initWithContentsOfFile:... bla bla

imagePX = [self rotateImage:imagePX]; //A
[self doStuff:imagePX]; //B

然后我有 rotateImage 方法:

- (UIImage*) rotateImage:(UIImage*)source {
  ... rotate the image... draw on context...
  [source drawInRect... bla bla
  ...

  UIImage *rotatedImage =  UIGraphicsGetImageFromCurrentImageContext();

  return rotatedImage;
}

我的问题是:imagePX 从未发布过。由于图像被传递给RotateImage方法,我想我可以简单地释放它,在命令[source drawInRect ...]上使用它之后,因为我会在方法上返回一个rotatedImage,但如果我这样做,程序会崩溃,因为变量 imagePX 应该存在,所以 A 行可以计算。

我的另一个问题是图像将在 B 上转发到另一个例程。那么,在不丢失 imagePX 和泄漏的情况下使其工作的最佳方法是什么?

最好的方法是什么?

【问题讨论】:

    标签: iphone iphone-sdk-3.0


    【解决方案1】:

    无需分配 UIImage 的实例。 imageWithContentsOfFile 是一个静态方法,可以在类本身上调用。

    由于imageWithContentsOfFile 不包括术语allocnewcopy,因此返回的对象(按照惯例)不会被保留,并将在自动释放池的第一次耗尽时自动释放。

    相反,如果您遇到过类似的情况,即您在尝试访问此对象时无法弄清楚为什么会收到 EXC_BAD_ACCESS 错误,则可能是发布得太早了。在这些情况下,您需要在此类范围内进行手动保留/释放。

    【讨论】:

      【解决方案2】:

      代替

      [[UIImage alloc]initWithContentsOfFile:... bla bla
      

      使用

      [UIImage imageWithContentsOfFile:...bla bla
      

      后者将被自动释放。

      【讨论】:

      • 当然!我确实忘记了 imageWithContentsOfFile!我正在考虑我使用的那个和 [UIImage imageNamed...] 但最后一个使用我试图保存的内存缓存图像,因为我试图让我的应用程序消耗内存。谢谢!
      【解决方案3】:

      [UIImage imageNamed:@""] 怎么样?无需alloc,无需释放)

      【讨论】: