【问题标题】:What is happening to memory when I do this?当我这样做时,内存会发生什么?
【发布时间】:2009-08-28 04:47:31
【问题描述】:

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

【问题讨论】:

    标签: objective-c memory-management uiimage


    【解决方案1】:

    如果您的EditViewController 的.h 文件用retain 声明editPhotoData1 @property,那么它将自动保留分配给它的任何对象。您至少需要在EditViewControllerdealloc 方法中明确地release 对象。

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

    - (void)dealloc
    {
        [editPhotoData1 release];
        ...
        [super dealloc];
    }
    

    【讨论】:

      【解决方案2】:

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

      图像命名:

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

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

      参数

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

      返回值

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

      讨论

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

      【讨论】:

        猜你喜欢
        • 2018-10-12
        • 2015-09-14
        • 2011-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-01
        • 1970-01-01
        相关资源
        最近更新 更多