在这两种方法之间,哪种方法更好/更有效?更具体地说,应该使用哪一种,或者是否有适当的时间使用其中一种而另一种呢?
UIImage *img = [UIImage imageWithContentsOfFile:filePath];或
UIImage *img = [[UIImage alloc] initWithContentsOfFile:filePath];谢谢!
编辑:--我应该提到我正在使用。
发布于 2013-06-26 13:49:34
第一个返回一个autoreleased对象。imageWithContentsOfFile:版本很有可能调用标准构造函数,因此在速度/效率方面不应该有任何明显的差异。两者在ARC环境中的执行和使用方式是相同的。
发布于 2013-06-26 14:00:11
最大的区别在于objective-c引用计数。当您init一个对象时,您是在声明对它的所有权。这意味着当您不再需要对象时,即通过调用[img release],您负责释放它。
当您获得一个方法的引用时,其名称以init或copy以外的东西开头(我不确定是否有其他前缀),这些对象将注册到NSAutoreleasePool中,并在池耗尽时自动释放。
你可以这样检查:
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方法已经在main.c文件中为您设置了一个池。
您可以在NSObject协议参考和高级内存管理中进一步研究这种机制。
发布于 2013-06-26 13:57:18
因为在一开始,我用alloc声明了我的所有映像,如果在某个函数的末尾,我返回了用alloc创建的映像,我必须自动释放该映像,因为内存泄漏问题。现在使用第一个声明,我不需要发布任何东西
当你“出售”一个物体时,这是完全正确的。但是在其他情况下,当您在iOS上创建一个对象时,您可以选择获得一个现成的自动发布对象,然后调用alloc然后再发布,苹果希望您使用alloc和release,因为这会使对象的生存期更短,并处于您的控制之下。
这里的问题是,自动释放的对象驻留在自动释放池中,并且可以堆积起来,直到池耗尽为止,无论何时都是如此。
另一件需要注意的事情是循环。您可以生成自动释放的对象,而不知道,它们只是堆积在池中。解决方案是在循环开始时创建自己的自动释放池,并在循环结束时释放它,以便每次通过循环释放对象。
编辑- 12/18/2011:但是随着iOS 5和iOS的到来,自动释放机制的效率要高得多,而且不存在发布之类的东西,因此区分alloc-init和自动发布对象的方便构造器之间的区别变得毫无意义。(而且,它现在是一个@autoreleasepool块,而不是一个自动释放池(伪)对象。)。
从这个问题。获得
https://stackoverflow.com/questions/17321879
复制相似问题