嗨,我基本上有两个问题
1) 在 ios6 xcode 4.2 ARC 环境中工作时是否仍然需要处理内存泄漏,因为我知道 arc 只在范围结束时调用。
2) 声明
self.profileImageView.image = [UIImage imageNamed:@"createProfile_addPhoto.png"];
它将图像放在内存中,这是屏幕的繁重过程。我在很多地方读过它,但没有找到任何替代代码来代替它。有没有更好的解决方案。
只是我需要处理内存问题。
嗨,我基本上有两个问题
1) 在 ios6 xcode 4.2 ARC 环境中工作时是否仍然需要处理内存泄漏,因为我知道 arc 只在范围结束时调用。
2) 声明
self.profileImageView.image = [UIImage imageNamed:@"createProfile_addPhoto.png"];
它将图像放在内存中,这是屏幕的繁重过程。我在很多地方读过它,但没有找到任何替代代码来代替它。有没有更好的解决方案。
只是我需要处理内存问题。
而不是imageNamed
使用 imageWithContentsOfFile:
NSString *imagePath = [[NSBundle mainBundle]pathForResource:@"createProfile_addPhoto" ofType:@"png"];
self.profileImageView.image = [UIImage imageWithContentsOfFile:imagePath];
我不知道我是否很好地理解了您的问题,但是:
1-ARC 确实管理了 Objective-C 对象的所有内存,并且在 iOS6 中还有 GCD 队列
2-您使用的方法将图像缓存在内存中以供进一步调用。因此,如果您多次调用此图像是值得的(除非图像真的很大)。
如果你需要创建一个更小的范围,你可以将你的代码嵌入到一个@autorelease
块中,这在处理循环时很有用,但如果你-imageNamed:
按照我所说的那样使用,则会缓存图像。更好用-imageWithContentsOfFile:
。
ARC 中的泄漏几乎是不可能的,如果您正在处理 Core Foundation 不透明类型,就会发生泄漏,这些类型不是由 ARC 自动管理的。使用 ARC 可能发生的事情是废弃内存或保留周期,从未听说过使用它的泄漏。
希望这会有所帮助,安德里亚
1) 是的,对于某些情况(即强参考周期)
2)[UIImage imageWithContentsOfFile:]
可以成为你的替代品。 imageNamed:
实现缓存系统。但是,当内存紧张时,它会自行清除。
问题 1):
ARC 内存泄漏的另一种可能性是使用没有设置自动释放池的单独线程。Apple docs https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html:
“您必须在线程开始执行后立即创建自己的自动释放池块;否则,您的应用程序将泄漏对象。”
如果没有设置自动释放池,即使调用一个简单的 getter 方法也会造成内存泄漏,如果它返回一个自动释放对象。