retain]和 init]之间的区别

由于以下两个目的相同,

today = [[NSDate date] retain]; 

 today = [[NSDate alloc] init]; 

那他们有什么区别?
这里的任何事情都和内存分配方法有关,否则就是相应地使用它们的原因。

[NSDate date]是一个方便的构造函数,使用它你可以离开对象autorelease池头痛。 将retain消息发送到便捷构造函数(如[[NSDate date] retain]将使您成为对象的所有者,并且您有责任正确地释放它。

[[NSDate alloc] init]是您成为对象所有者的默认初始化程序,它几乎等于 [[NSDate date] retain]

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

如果我想在创build它之后保留该对象,并且该类可用-init样式方法,则几乎总是select通过便捷构造器加上-retain

两者实际上没有区别。 在第一个例子中,你只是保留了一个由便捷方法创build的autoreleased实例,它可以完成类似于return [[[NSDate alloc] init] autorelease]

当你这样做:

 [NSDate date]; 

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

当你这样做:

 [[NSDate alloc] init]; 

…创build一个新的NSDate,当你完成它时,你应该释放它。

从内存pipe理的angular度来看, [[NSDate date] retain]和替代scheme之间的主要区别在于,这个NSDate 至less要到事件循环结束。 如果你只是创build一些对象,那没关系。 但是,如果你创build(并释放)了很多对象 – 比如在一个循环中处理数据时 – 使用前一个模式可能会导致应用程序的内存使用量激增(然后在事件循环结束时突然下降) 。 在后一种模式下,只要释放它,对象就会被销毁。

大多数时候,当一个类有一个autoreleased初始化 – 它看起来像这样:

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

所以当你打电话时[[NSDate date] retain]; ,你正在有效地打电话

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

其中,如果你问我,是相当无意义的 – 我只是坚持[[NSDate alloc] init]; 用于初始化对象。

方便的方法就是在那里,所以你可以很快得到一个自动释放的对象 – 不要和retain一起使用。 它会做同样的事情,但我会说如果你想要一个保留的对象,最好调用标准的初始化器。