0

我试图弄清楚如何在各种视图控制器之间传递 UIImage 而不复制 UIImage 并不必要地增加内存。使用以下方法成功传递了图像,但我似乎无法稍后释放此 UIImage,这最终导致我的应用程序因无法计算的 7MB+ 数据而变得沉重。我想知道的是,当我将 UIImage(属于我当前的视图控制器)传递给我将切换到下一个视图控制器,然后释放原始指针时,内存会发生什么?像这样:

-(IBAction)startEditing:(id)sender
{

    EditViewController *controller = [[EditViewController alloc] initWithNibName:@"EditViewController" bundle:nil];
    controller.delegate = self;

            //imageDataPhoto1 is of type UIImage (from camera)
            controller.editPhotoData1 = imageDataPhoto1;
            [imageDataPhoto1 release];
            imageDataPhoto1 = nil;

        controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentModalViewController:controller animated:YES];

    [controller release];

}

指针imageDataPhoto1的 DATA是否因为在释放之前被分配给视图控制器实例而没有被释放?

4

2 回答 2

2

如果您EditViewController的 .h 文件声明了editPhotoData1 @propertywith retain,那么它将自动保留分配给它的任何对象。您release至少需要在EditViewController'sdealloc方法中显式地访问该对象。

当然,您应该确保release为所有类设置保留在您的 dealloc 方法中的任何属性,即:

- (void)dealloc
{
    [editPhotoData1 release];
    ...
    [super dealloc];
}
于 2009-08-28T05:58:25.540 回答
1

阅读 UIImage。它在幕后进行了大量的缓存和重新加载,尤其是当它从命名文件或路径中获取图片时。我不认为复制实例实际上会创建第二个副本。查看 +imageNamed 和其他人的描述以了解我在说什么:

图片名称:

返回与指定文件名关联的图像对象。

  • (UIImage *)imageNamed:(NSString *)name

参数

name 文件的名称,包括其文件扩展名。如果这是第一次加载图像,该方法会在应用程序的主包中查找具有指定名称的图像。

返回值

指定文件的图像对象,如果方法找不到指定的图像,则返回 nil。

讨论

此方法在系统缓存中查找具有指定名称的图像对象,如果存在则返回该对象。如果匹配的图像对象尚未在缓存中,则此方法从指定文件加载图像数据,缓存它,然后返回结果对象。

于 2009-08-28T10:16:06.103 回答