Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone [[NSDate date]retain]和[[NSDate alloc]init]之间的差异_Iphone_Objective C_Ios_Cocoa - Fatal编程技术网

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]
。我也发现了有用的链接。那么,使用后一个更有效?是吗?是的,有点。尽管现在的计算机速度如此之快,但除非你用这种方式创建数千个,甚至数百万个对象,否则你永远不会注意到有什么不同。我也找到了有用的链接。