Ios UIImage-imageWithContentsOfFile:vs initWithContentsOfFile

Ios UIImage-imageWithContentsOfFile:vs initWithContentsOfFile,ios,objective-c,uiimage,Ios,Objective C,Uiimage,在这两种方法之间,哪一种更好/更有效?更具体地说,应该使用哪一种,或者是否有适当的时间使用其中一种 UIImage *img = [UIImage imageWithContentsOfFile:filePath]; 或 谢谢 编辑:我应该提到我正在使用ARC。第一个返回一个自动释放的对象。imageWithContentsOfFile:version很有可能调用标准构造函数,因此在速度/效率方面应该没有任何明显的差异。在ARC环境中,两者的执行和使用方式相同 第一个返回一个自动释放的对象。i

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

UIImage *img = [UIImage imageWithContentsOfFile:filePath];

谢谢

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

第一个返回一个自动释放的对象。imageWithContentsOfFile:version很有可能调用标准构造函数,因此在速度/效率方面应该没有任何明显的差异。在ARC环境中,两者的执行和使用方式相同

第一个返回一个自动释放的对象。imageWithContentsOfFile:version很有可能调用标准构造函数,因此在速度/效率方面应该没有任何明显的差异。在ARC环境中,两者的执行和使用方式相同

因为一开始我用alloc和 如果在某个函数的末尾,我返回了用 alloc我不得不自动释放该图像,因为内存泄漏问题。 现在使用第一个声明,我不需要发布任何东西

当你出售一件物品时,这是完全正确的。但在其他情况下,当你在iOS上创建一个对象时,你可以在获取一个现成的自动释放对象和调用alloc然后再调用release之间进行选择,苹果希望你使用alloc和release,因为这样可以缩短对象的生命周期,并在你的控制之下

这里的问题是,自动释放对象位于自动释放池中,并且可能会堆积起来,直到池中的水排干为止,无论何时

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

编辑-12/18/2011:但是随着iOS5和ARC的到来,自动释放机制更加高效,并且没有释放这样的东西,因此alloc init和出售自动释放对象的方便构造函数之间的区别变得毫无意义。此外,它现在是@autoreleasepool块,而不是autoreleasepool伪对象

因为一开始我用alloc和 如果在某个函数的末尾,我返回了用 alloc我不得不自动释放该图像,因为内存泄漏问题。 现在使用第一个声明,我不需要发布任何东西

当你出售一件物品时,这是完全正确的。但在其他情况下,当你在iOS上创建一个对象时,你可以在获取一个现成的自动释放对象和调用alloc然后再调用release之间进行选择,苹果希望你使用alloc和release,因为这样可以缩短对象的生命周期,并在你的控制之下

这里的问题是,自动释放对象位于自动释放池中,并且可能会堆积起来,直到池中的水排干为止,无论何时

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

编辑-12/18/2011:但是随着iOS5和ARC的到来,自动释放机制更加高效,并且没有释放这样的东西,因此alloc init和出售自动释放对象的方便构造函数之间的区别变得毫无意义。此外,它现在是@autoreleasepool块,而不是autoreleasepool伪对象


中得出,最大的差异在于客观c参考计数。当您初始化一个对象时,您是在声明它的所有权。这意味着当您不再需要该对象时,您有责任释放它,即通过调用[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,不要太担心它的工作情况,因为主.c文件中的NSApplicationMain方法已经为您设置了一个池


您可以在和中进一步研究这一机制。

最大的区别在于objective-c参考计数。当您初始化一个对象时,您是在声明它的所有权。这意味着您有责任在不再需要该对象时释放它,即 y呼叫[img释放]

当您得到一个方法的引用,该方法的名称以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,不要太担心它的工作情况,因为主.c文件中的NSApplicationMain方法已经为您设置了一个池

您可以在和中进一步研究此机制