0

以下 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];

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

4

2 回答 2

2

我看到人们试图建议使用工厂方法。

我猜那是因为它基本上是一样的,但你不必记住释放对象。有人可能会说,使用便捷方法也更具可读性,尤其是因为您不必以 -release 消息序列结束每个方法。

尽快释放对象而不是在池耗尽时释放对象不是更好吗?

您可以在某些情况下使用这种情况,例如在循环内。不过,这通常不是一个重要的考虑因素……许多方法根本不循环,只创建少数对象。

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

当然。所以你应该知道什么时候自动释放对象,什么时候不适合自动释放对象,你应该相应地编写你的代码。但是这并不意味着你应该总是尽量避免自动释放对象,就像总是尝试使用便利方法一样。

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

于 2011-03-27T10:03:30.730 回答
0

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

于 2011-03-27T09:48:00.353 回答