1

嗨,我基本上有两个问题

1) 在 ios6 xcode 4.2 ARC 环境中工作时是否仍然需要处理内存泄漏,因为我知道 arc 只在范围结束时调用。

2) 声明

self.profileImageView.image = [UIImage imageNamed:@"createProfile_addPhoto.png"];

它将图像放在内存中,这是屏幕的繁重过程。我在很多地方读过它,但没有找到任何替代代码来代替它。有没有更好的解决方案。

只是我需要处理内存问题。

4

4 回答 4

4

而不是imageNamed使用 imageWithContentsOfFile:

 NSString *imagePath = [[NSBundle mainBundle]pathForResource:@"createProfile_addPhoto" ofType:@"png"];

 self.profileImageView.image =  [UIImage imageWithContentsOfFile:imagePath];
于 2013-03-27T07:17:22.663 回答
2

我不知道我是否很好地理解了您的问题,但是:
1-ARC 确实管理了 Objective-C 对象的所有内存,并且在 iOS6 中还有 GCD 队列
2-您使用的方法将图像缓存在内存中以供进一步调用。因此,如果您多次调用此图像是值得的(除非图像真的很大)。

如果你需要创建一个更小的范围,你可以将你的代码嵌入到一个@autorelease块中,这在处理循环时很有用,但如果你-imageNamed:按照我所说的那样使用,则会缓存图像。更好用-imageWithContentsOfFile:
ARC 中的泄漏几乎是不可能的,如果您正在处理 Core Foundation 不透明类型,就会发生泄漏,这些类型不是由 ARC 自动管理的。使用 ARC 可能发生的事情是废弃内存或保留周期,从未听说过使用它的泄漏。
希望这会有所帮助,安德里亚

于 2013-03-27T08:00:50.343 回答
2

1) 是的,对于某些情况(即强参考周期)

2)[UIImage imageWithContentsOfFile:]可以成为你的替代品。 imageNamed:实现缓存系统。但是,当内存紧张时,它会自行清除。

于 2013-03-27T07:15:45.343 回答
2

问题 1):
ARC 内存泄漏的另一种可能性是使用没有设置自动释放池的单独线程。Apple docs https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html
“您必须在线程开始执行后立即创建自己的自动释放池块;否则,您的应用程序将泄漏对象。”
如果没有设置自动释放池,即使调用一个简单的 getter 方法也会造成内存泄漏,如果它返回一个自动释放对象。

于 2013-03-27T08:03:00.093 回答