两种方法之间哪种更好/更有效?更具体地说,哪个应该使用,或者是否有适当的时间来使用另一个?
UIImage *img = [UIImage imageWithContentsOfFile:filePath];
或
UIImage *img = [[UIImage alloc] initWithContentsOfFile:filePath];
谢谢!
编辑:我应该提到我正在使用ARC。
答案 0 :(得分:7)
第一个返回autorelease
d对象。 imageWithContentsOfFile:
版本很可能会调用标准构造函数,因此速度/效率不应有明显差异。在ARC环境中执行和使用相同的方式。
答案 1 :(得分:2)
最大的区别在于objective-c
引用计数。当您init
某个对象时,您声称对其拥有所有权。这意味着当您不再需要该对象时,即负责调用[img release]
时,您有责任释放它。
当您获得对名称以init
或copy
以外的其他内容开头的方法的引用时(我不确定是否有任何其他前缀),这些对象都注册了{{ 1}}并在池耗尽时自动释放。
您可以这样检查:
NSAutoreleasePool
要实现自动释放行为,在创建对象的acessor并因此将所有权委托给accessor方法而不是调用方法时,应该执行以下操作:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
UIImage *img1 = [UIImage imageWithContentsOfFile:filePath];
UIImage *img2 = [[UIImage alloc] initWithContentsOfFile:filePath];
[pool drain];
NSLog(@"%@", [img1 retainCount]); // 1
NSLog(@"%@", [img2 retainCount]); // 0 or invalid mem access, not sure
至于[obj autorelease];
并不担心其工作,因为NSAutoreleasePool
文件中的NSApplicationMain
方法已经为您设置了一个池。
您可以在NSObject Protocol Reference和Advanced Memory Management中进一步调查此机制。
答案 2 :(得分:1)
因为在开始时我用alloc和声明我的所有图像 如果在某个功能的最后我返回了用它创建的图像 alloc我必须自动释放该图像,因为内存泄漏问题。 现在使用第一个声明我不需要发布任何东西
当你“抛售”一个物体时,这是完全正确的。但在其他情况下,当您在iOS上创建一个对象时,您可以在获取现成的自动释放对象和调用alloc然后释放之间做出选择,Apple希望您使用alloc和release,因为这样可以保持对象的生命周期在你的掌控之下。
这里的问题是自动释放的对象存在于自动释放池中,并且可以堆积直到池被耗尽,无论何时都可以。
需要注意的另一件事是循环。您可能会在不知情的情况下生成自动释放的对象,并且它们只会堆积在池中。解决方案是在循环开始时创建自己的自动释放池,并在循环结束时释放它,以便每次循环时都释放对象。
编辑 - 12/18/2011:但是随着iOS 5和ARC的到来,自动释放机制效率更高,并且没有发布这样的东西,所以alloc-init和a之间的区别便利构造商出售一个自动释放的对象变得没有实际意义。 (此外它现在是@autoreleasepool块而不是自动释放池(伪)对象。)