我试图弄清楚如何在各种视图控制器之间传递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是否因为在释放之前被分配给视图控制器实例而未被释放?
答案 0 :(得分:2)
如果您的EditViewController
.h。文件使用editPhotoData1
声明@property
retain
,则会自动保留分配给它的任何对象。您至少需要release
EditViewController
方法明确dealloc
该对象。
当然,对于所有类,你应该确保release
任何设置为dealloc方法的属性都保留,即:
- (void)dealloc
{
[editPhotoData1 release];
...
[super dealloc];
}
答案 1 :(得分:1)
阅读UIImage。它在幕后进行了大量的缓存和重新加载,特别是如果它从命名文件或路径获取图片。我不认为复制实例实际上会创建第二个副本。请参阅+ imageNamed和其他人的说明,了解我在说什么:
imageNamed:
返回关联的图像对象 使用指定的文件名。
- (UIImage *)imageNamed:(NSString *)name
参数
name文件的名称,包括 它的文件扩展名。如果这是 第一次加载图像时 该方法查找带有的图像 应用程序中的指定名称 主要包。
返回值
指定的图像对象 file,如果方法不能,则为nil 找到指定的图像。
讨论
此方法在系统缓存中查找 对于具有指定的图像对象 命名并返回该对象(如果它) 存在。如果匹配的图像对象是 尚未在缓存中,此方法 从中加载图像数据 指定文件,缓存它,然后 返回结果对象。