由于以下两者都有相同的目的,
today = [[NSDate date] retain];
和
today = [[NSDate alloc] init];
然后它们之间有什么区别?
这里的任何内容都与内存分配方法有关,或者其他因素是相应使用它们的原因。
答案 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一起使用。它也会这样做,但我想说如果你想要一个保留的对象,最好只调用标准的初始化器。