【问题标题】:Difference between [[NSDate date] retain] and [[NSDate alloc] init][[NSDate date] retain] 和 [[NSDate alloc] init] 之间的区别
【发布时间】:2011-08-18 05:17:03
【问题描述】:

由于以下两个目的相同,

today = [[NSDate date] retain];    

today = [[NSDate alloc] init]; 

那它们有什么区别呢?
这里是否有任何与内存分配方法相关的内容或其他原因是相应地使用它们的原因。

【问题讨论】:

  • 请注意,您的第二个示例等效于today = [NSDate new]
  • 我也发现了this 有用的链接。

标签: iphone objective-c ios cocoa


【解决方案1】:

[NSDate date] 是一个方便的构造函数,使用它可以让您不必担心将对象释放到自动释放池。将retain 消息发送到[[NSDate date] retain] 之类的便利构造函数使您成为对象的所有者,并且您有责任正确释放它。

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

【讨论】:

  • 我也发现了this 有用的链接。
【解决方案2】:

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

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

【讨论】:

  • 那么,使用后一种效率更高?是这样吗?
  • 是的,稍微。不过,如今的计算机速度如此之快,除非您以这种方式创建数千甚至数百万个对象,否则您永远不会注意到差异。
【解决方案3】:

两者之间实际上没有区别。在第一个示例中,您只是保留了一个由便捷方法创建的自动释放实例,它会执行类似return [[[NSDate alloc] init] autorelease] 的操作。

【讨论】:

    【解决方案4】:

    当你这样做时:

    [NSDate date];
    

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

    当你这样做时:

    [[NSDate alloc] init];
    

    …创建了一个新的 NSDate,你应该在完成后释放它。

    从内存管理的角度来看,[[NSDate date] retain] 和替代方案之间的主要区别在于,这个 NSDate 将在 至少 左右直到事件循环结束。如果你只是创建几个对象,那没关系。但是,如果您创建(并释放)大量对象(例如,在循环中处理数据时),使用前一种模式可能会导致应用程序的内存使用量激增(然后突然下降事件循环结束)。对于后一种模式,对象一释放就会被销毁。

    【讨论】:

      【解决方案5】:

      大多数时候,当一个类有一个自动释放的初始化器时 - 它看起来像这样:

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

      所以当您拨打[[NSDate date] retain]; 时,您实际上是在拨打电话

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

      如果你问我,这毫无意义 - 我会坚持使用 [[NSDate alloc] init]; 来初始化对象。

      有方便的方法,因此您可以快速获取自动释放的对象 - 不要与保留一起使用。它会做同样的事情,但我会说如果你想要一个保留的对象,最好只调用标准初始化程序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 2011-07-22
        • 2011-07-30
        • 1970-01-01
        • 2013-06-12
        • 1970-01-01
        • 2011-06-25
        相关资源
        最近更新 更多