当我这样做时,记忆会发生什么?

时间:2009-08-28 04:47:31

标签: objective-c memory-management uiimage

我试图弄清楚如何在各种视图控制器之间传递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是否因为在释放之前被分配给视图控制器实例而未被释放?

2 个答案:

答案 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   找到指定的图像。

     

讨论

     

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