Objective-C中工厂方法的性能

时间:2011-03-27 09:30:54

标签: objective-c memory-management nsautoreleasepool

在以下2段代码中,性能方面是否存在差异?

NSString* str = [[NSString alloc] initWithFormat:@"%i", 10];
// Do something with |str|.
[str release];

NSAutorelasePool* pool = [[NSAutreleasePool alloc] init];
NSString* str = [NSString stringWithFormat:@"%i", 10];
// Do something with |str|.
[pool drain];

我看到人们试图建议尽可能使用工厂方法。 是否尽快释放对象而不是在池中耗尽时更好。 我会看到第一种类型在某些情况下非常有效,例如在紧密循环中。

2 个答案:

答案 0 :(得分:2)

  

我看到有人试图建议使用   工厂方法可能。

我猜这是因为它基本上是一样的,但你不必记得发布这个对象。有些人可能会说使用便捷方法也更具可读性,特别是因为您不必使用一系列发布消息来结束每个方法。

  

将对象释放为不是更好   尽快而不是当   游泳池已经耗尽。

您可以在某些情况下制作该案例,例如在循环内部。这通常不是一个重要的考虑因素,但是......许多方法根本不会循环,只会创建一些对象。

  

我会看到第一种类型非常   在某些情况下有效,例如   紧环。

不确定。因此,您应该知道它何时以及何时不适合自动释放对象,您应该相应地编写代码。但这并不意味着你应该总是尽量避免自动释放对象,而不是总是尝试使用便利方法。

顺便说一句,如果您正在编写多次迭代的循环,您应该考虑创建一个自动释放池。有可能,你将在循环中使用其他方法,这些方法可能会创建自动释放的对象。使用您自己的池并定期排空它可以防止这些对象堆积。但是,如果你这样做,那么你就不应该在循环中使用自动释放的对象。

答案 1 :(得分:0)

是的。第一个是更好的内存管理,如果你这样做是值得的,就像你说的那样,循环以避免在下一个池流失之前分配很多。