【问题标题】:Do we need to release an UIImage object even not allocated memory?即使没有分配内存,我们是否需要释放 UIImage 对象?
【发布时间】:2010-03-26 09:04:03
【问题描述】:

我在按钮上添加了一张图片

UIImage* deleteImage = [UIImage imageNamed:@"Delete.png"];
CGRect imageFrame=CGRectMake(-4,-4, 310, 55);
[btn setFrame:imageFrame];
btn.backgroundColor=[UIColor clearColor];
[btn setBackgroundImage:deleteImage forState:UIControlStateNormal];
[btn setTitle:@"Delete" forState:UIControlStateNormal];
[btn addTarget:self  action:@selector(editDeleteAction) forControlEvents:UIControlEventTouchUpInside];
[elementView addSubview:btn];
[deleteImage release];// do we need to release the image here

如果我在这里发布它可以正常工作,但在对象分配中,图像数量正在增加。

【问题讨论】:

标签: iphone objective-c uiimage


【解决方案1】:

如果您使用 imageNamed: 消息创建图像,则不必释放它,因为您会得到一个自动释放的图像。

仅当您使用 init...: 消息之一创建图像时,您必须稍后发布它。

【讨论】:

  • 您使用init 实例化的任何对象都是如此 - 您拥有它,因此您必须释放它。
  • 更多的是使用任何 CARN 规则方法创建新对象(不一定要实例化)的任何对象。也就是说,任何包含单词 Copy、Alloc、Retain 或 New 的方法都应该返回一个保留计数为 +1 的对象,并且归调用者所有,并且应该在某个时候释放。其他任何东西都假定返回一个自动释放的对象。
  • 欲了解更多信息,请查看苹果文档中的 iPhone 内存管理指南:developer.apple.com/iphone/library/documentation/Cocoa/…
【解决方案2】:

"imageNamed:" 方法给出了一个 autoreleased 对象,因此您不必释放对象。

仅供参考:“imageNamed:”方法使用内部缓存(如果广泛使用 imageNamed: 方法,您可能会面临内存警告)。收到警告时最好删除缓存。

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
    [[ImageCache sharedImageCache] removeAllImagesInMemory];
}

阅读本指南http://akosma.com/2009/01/28/10-iphone-memory-management-tips/

【讨论】:

  • 从 iPhone OS 3.0 开始解决了 imageNamed: 缓存问题。但是,如果您的应用程序必须使用任何 2.x 版本,这将是一个真正的问题......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 2017-02-16
  • 2015-06-29
相关资源
最近更新 更多