使用ARC进行内存管理 - 性能问题

时间:2011-11-06 17:49:19

标签: objective-c ios memory-management automatic-ref-counting

我有一些关于ARC内存管理的一般初学者问题。我在我的应用程序中遇到了一些性能问题 - 无论是在我的设备上还是在模拟器上。性能问题仅在我以“视网膜”模式运行模拟器时出现,因此我认为我必须有“记忆”问题。当我在设备上测试应用程序时,我还在日志中看到“收到内存警告”。

首先,当我创建要在子视图中使用的UIImages时,我应该在将其分配给子视图后将其设置为nil吗?示例:

UIImage * image = [UIImage imageNamed:@"Image.png"];
UIImageView * imageView = [[UIImageView alloc] initWithImage:image];
[self.view addSubview:imageView];
// Should I set image && imageView to nil here?

这是否也适用于其他局部变量和/或实例变量?

其次,我目前使用的

是创建实例变量的正确ARC方法
UiView  * view;

// And implement it in @implementation
view = [[UIView alloc] initWithFrame:frame];

任何指导和提示将不胜感激。良好ARC资源的链接也很棒。

2 个答案:

答案 0 :(得分:4)

您的代码没问题。那里的内存管理没有问题。只有可能导致问题的因素是[UIImage imageNamed:],因为它会加载已加载的图像。请尝试使用[[UIImage alloc] initWithContentsOfFile:]

你可以找到关于ARC here

的好文章

答案 1 :(得分:2)

你遇到的两个ARC相关问题都没问题。您不需要手动将任何变量设置为nil;当它们超出范围时,它们将自动设置为nil。 ARC计算出如何保留/释放实例变量,因此不需要做任何特殊的事情。

正如您所提到的,当您在视网膜显示屏上运行应用程序时会出现问题。考虑到您的代码与图像密切相关,我怀疑问题与图像有关。可能Image.png是高分辨率,并且在视网膜设备上以使用大量内存的方式分配。

我建议您尝试:

  • a)在图片视图上调用initWithFrame:,然后调用setImage:,这样,由于奇怪的{{1},图像视图不会被调整大小或处理奇怪视网膜行为。
  • b)手动调整资源UIImage的尺寸,使其更小。这可以通过任何基本图像编辑器完成,例如预览。