UIImage - imageWithContentsOfFile:vs initWithContentsOfFile

时间:2013-06-26 13:47:11

标签: ios objective-c uiimage

两种方法之间哪种更好/更有效?更具体地说,哪个应该使用,或者是否有适当的时间来使用另一个?

UIImage *img = [UIImage imageWithContentsOfFile:filePath];

UIImage *img = [[UIImage alloc] initWithContentsOfFile:filePath];

谢谢!

编辑:我应该提到我正在使用ARC。

3 个答案:

答案 0 :(得分:7)

第一个返回autorelease d对象。 imageWithContentsOfFile:版本很可能会调用标准构造函数,因此速度/效率不应有明显差异。在ARC环境中执行和使用相同的方式。

答案 1 :(得分:2)

最大的区别在于objective-c引用计数。当您init某个对象时,您声称对其拥有所有权。这意味着当您不再需要该对象时,即负责调用[img release]时,您有责任释放它。

当您获得对名称以initcopy以外的其他内容开头的方法的引用时(我不确定是否有任何其他前缀),这些对象都注册了{{ 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 ReferenceAdvanced Memory Management中进一步调查此机制。

答案 2 :(得分:1)

  

因为在开始时我用alloc和声明我的所有图像   如果在某个功能的最后我返回了用它创建的图像   alloc我必须自动释放该图像,因为内存泄漏问题。   现在使用第一个声明我不需要发布任何东西

当你“抛售”一个物体时,这是完全正确的。但在其他情况下,当您在iOS上创建一个对象时,您可以在获取现成的自动释放对象和调用alloc然后释放之间做出选择,Apple希望您使用alloc和release,因为这样可以保持对象的生命周期在你的掌控之下。

这里的问题是自动释放的对象存在于自动释放池中,并且可以堆积直到池被耗尽,无论何时都可以。

需要注意的另一件事是循环。您可能会在不知情的情况下生成自动释放的对象,并且它们只会堆积在池中。解决方案是在循环开始时创建自己的自动释放池,并在循环结束时释放它,以便每次循环时都释放对象。

编辑 - 12/18/2011:但是随着iOS 5和ARC的到来,自动释放机制效率更高,并且没有发布这样的东西,所以alloc-init和a之间的区别便利构造商出售一个自动释放的对象变得没有实际意义。 (此外它现在是@autoreleasepool块而不是自动释放池(伪)对象。)

来自this question.