[[NSDate date] retain]和[[NSDate alloc] init]之间的区别

时间:2011-08-18 05:17:03

标签: iphone objective-c ios cocoa

由于以下两者都有相同的目的,

today = [[NSDate date] retain];    

today = [[NSDate alloc] init]; 

然后它们之间有什么区别?
这里的任何内容都与内存分配方法有关,或者其他因素是相应使用它们的原因。

5 个答案:

答案 0 :(得分:6)

[NSDate date]是一个便利构造函数,您可以使用它来解释将对象释放到自动释放池。将retain消息发送到方便构造函数(如[[NSDate date] retain])会使您成为对象的所有者,并且您有责任正确地释放它。

[[NSDate alloc] init]是您成为对象所有者的默认初始值设定项,几乎等于 [[NSDate date] retain]

答案 1 :(得分:5)

除了前者不必要地将对象放入自动释放池之外,基本上没有区别。

如果我想在创建对象后保留该对象,并且该类可以使用-init样式方法,我几乎总是选择方便构造函数加上-retain

答案 2 :(得分:5)

两者之间实际上没有区别。在第一个示例中,您只是保留由方便方法创建的自动释放实例,该方法可能会执行类似return [[[NSDate alloc] init] autorelease]的操作。

答案 3 :(得分:2)

执行此操作时:

[NSDate date];

...创建一个新的NSDate,它将在事件循环结束时自动释放(不释放!)。当然,你可以保留它以保持更长时间。

执行此操作时:

[[NSDate alloc] init];

...创建了一个新的NSDate,您应该在完成后释放它。

从内存管理的角度来看,[[NSDate date] retain]和替代方案之间的主要区别是,此NSDate将至少围绕,直到事件循环结束。如果你只是创建一些对象,那没关系。但是,如果您创建(并发布) lot 对象 - 比如说,在循环中处理数据时 - 使用前一种模式可能会导致应用程序的内存使用量激增(然后突然降低)事件循环的结束)。使用后一种模式,一旦释放它,对象就会被破坏。

答案 4 :(得分:0)

大多数情况下,当一个类有一个自动释放的初始化程序时 - 它看起来像这样:

return [[[NSDate alloc] init] autorelease];

因此,当您致电[[NSDate date] retain];时,您实际上正在呼叫

[[[[NSDate alloc] init] autorelease] retain];

如果你问我,这是毫无意义的 - 我只是坚持[[NSDate alloc] init];来初始化对象。

方便的方法在那里你可以快速获得一个自动释放的对象 - 不要与retain一起使用。它也会这样做,但我想说如果你想要一个保留的对象,最好只调用标准的初始化器。