繁体   English   中英

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

[英]Difference between [[NSDate date] retain] and [[NSDate alloc] init]

由于以下两个用途相同,

today = [[NSDate date] retain];    

today = [[NSDate alloc] init]; 

那么它们之间的区别是什么?
这里有什么与内存分配方法有关或其他东西是相应使用它们的原因。

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

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

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

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

两者之间实际上没有区别。 在第一个例子中,你只是保留了一个由easy方法创建的自动释放的实例,它会做类似return [[[NSDate alloc] init] autorelease]事情。

当你这样做:

[NSDate date];

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

当你这样做:

[[NSDate alloc] init];

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

从内存管理的角度来看, [[NSDate date] retain]和替代方案之间的主要区别是这个NSDate将至少在事件循环结束之前。 如果你只是创建一些对象,那没关系。 但是,如果您创建(并释放) 许多对象 - 比如,在循环中处理数据时 - 使用前一种模式可能会导致应用程序的内存使用量出现峰值(然后在事件循环结束时突然掉落) 。 使用后一种模式,一旦释放它,对象就会被破坏。

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

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

所以当你调用[[NSDate date] retain]; ,你有效地打电话

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM