Iphone [[NSDate date]retain]和[[NSDate alloc]init]之间的差异
由于以下两项用途相同Iphone [[NSDate date]retain]和[[NSDate alloc]init]之间的差异,iphone,objective-c,ios,cocoa,Iphone,Objective C,Ios,Cocoa,由于以下两项用途相同 today = [[NSDate date] retain]; 及 那么它们之间有什么区别呢? 这里的任何事情都与内存分配方法或其他相关,这就是相应地使用它们的原因。基本上没有区别,只是前者不必要地将对象放入自动释放池中 如果我想在创建对象后保留它,并且类可以使用-init样式的方法,我几乎总是选择方便的构造函数加上-retain,两者实际上没有区别。在第一个示例中,您只是保留了一个由便利方法创建的自动释放实例,该方法可以执行类似于返回[[[NSDate allo
today = [[NSDate date] retain];
及
那么它们之间有什么区别呢?这里的任何事情都与内存分配方法或其他相关,这就是相应地使用它们的原因。基本上没有区别,只是前者不必要地将对象放入自动释放池中
如果我想在创建对象后保留它,并且类可以使用
-init
样式的方法,我几乎总是选择方便的构造函数加上-retain,两者实际上没有区别。在第一个示例中,您只是保留了一个由便利方法创建的自动释放实例,该方法可以执行类似于返回[[[NSDate alloc]init]autorelease]
[NSDate date]
的操作,您可以使用它将对象释放到自动释放池。向便利构造函数发送retain
消息,如[[NSDate]retain]
会使您成为对象的所有者,并负责正确释放它
[[NSDate alloc]init]
是默认的初始值设定项,通过该初始值设定项,您可以成为对象的所有者,当您执行以下操作时,几乎等于[[NSDate date]retain]
:
[NSDate date];
[[NSDate alloc] init];
…将创建一个新的NSDate,它将在事件循环结束时自动释放(而不是释放!)。当然,您可以保留它以使其保留更长时间
执行此操作时:
[NSDate date];
[[NSDate alloc] init];
…将创建一个新的NSDate,您应该在完成后发布它
从内存管理的角度来看,[[NSDate date]retain]
和另一种选择之间的主要区别是,此NSDate至少在事件循环结束之前一直存在。如果你只是创建了几个对象,那没关系。但是,如果您创建(并释放)了很多对象(例如,在循环中处理数据时),使用前一种模式可能会导致应用程序的内存使用量激增(然后在事件循环结束时突然下降)。对于后一种模式,对象一释放就会被销毁。大多数情况下,当类具有自动释放的初始值设定项时,它看起来是这样的:
return [[[NSDate alloc] init] autorelease];
所以当你调用[[NSDate]retain]代码>,您正在有效地调用
[[[[NSDate alloc] init] autorelease] retain];
如果你问我,这是相当没有意义的-我只会坚持[[NSDate alloc]init]用于初始化对象的代码>
convinience方法在那里,因此您可以快速获得自动释放对象,而不是与retain一起使用。它也会这样做,但我想说,如果您想要保留对象,最好只调用标准初始化器。请注意,您的第二个示例相当于today=[NSDate new]
。我也发现了有用的链接。那么,使用后一个更有效?是吗?是的,有点。尽管现在的计算机速度如此之快,但除非你用这种方式创建数千个,甚至数百万个对象,否则你永远不会注意到有什么不同。我也找到了有用的链接。