我有一些关于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资源的链接也很棒。
答案 0 :(得分:4)
您的代码没问题。那里的内存管理没有问题。只有可能导致问题的因素是[UIImage imageNamed:]
,因为它会加载已加载的图像。请尝试使用[[UIImage alloc] initWithContentsOfFile:]
。
你可以找到关于ARC here
的好文章答案 1 :(得分:2)
你遇到的两个ARC相关问题都没问题。您不需要手动将任何变量设置为nil;当它们超出范围时,它们将自动设置为nil。 ARC计算出如何保留/释放实例变量,因此不需要做任何特殊的事情。
正如您所提到的,当您在视网膜显示屏上运行应用程序时会出现问题。考虑到您的代码与图像密切相关,我怀疑问题与图像有关。可能Image.png
是高分辨率,并且在视网膜设备上以使用大量内存的方式分配。
我建议您尝试:
initWithFrame:
,然后调用setImage:
,这样,由于奇怪的{{1},图像视图不会被调整大小或处理奇怪视网膜行为。UIImage
的尺寸,使其更小。这可以通过任何基本图像编辑器完成,例如预览。