【问题标题】:NSDate init question, related to memory management in Objective-CNSDate 初始化问题,与 Objective-C 中的内存管理有关
【发布时间】:2009-08-06 19:02:02
【问题描述】:

我有一个由

创建的NSDate 对象
NSDate *date = [[NSDate alloc] init];

稍后,我想将日期重置为“现在”,所以我认为

[date init];

date = [date init];

可能会完成这项工作,但他们不会。相反,

[date release];
date = [[NSDate alloc] init];

有效。我对此有点困惑,因为在- (id) init 的文档中,它说:

返回一个初始化为当前日期和时间的 NSDate 对象。

既然date 已经分配好了,它不应该只需要一个init 消息吗?

【问题讨论】:

  • 日期是不可变的,不能更改。如果您想要现在的时间,您需要创建一个新日期。请参阅下面 Quinn 的回答,特别是:init。在任何给定对象上多次调用 init 总是一个编程错误。

标签: objective-c memory-management initialization nsdate


【解决方案1】:

allocinit 视为构造函数在逻辑上不可分割的部分。您只能在给定对象上调用一次以“init”开头的方法 - 一旦对象已初始化,再次初始化它是错误的。这适用于任何 Objective-C 对象,而不仅仅是 NSDate。然而,NSDate 对象也是不可变的——一旦被创建,它们就无法改变。

后一个代码起作用的原因是因为您正在创建一个新的 NSDate 实例,这是正确的做法。您也可以使用 [NSDate date] 来完成同样的事情。请注意,它会返回一个您(尚未)拥有的对象,因此如果您需要保留它,则需要保留它,然后再释放它。

请注意,如果您从某人那里收到一个对象,它已经被初始化了。 (如果不是,这是提供它的代码中的编程错误,或者是该规则的极不常见的例外。)

【讨论】:

  • 那么对于 Objective-C 来说,哪个更“惯用”?要使用[NSDate date]retain,还是上面的[[NSDate alloc] init]release
  • 没有比这更惯用的了,这取决于你想要什么。但是,并非所有类都有“便利构造函数”方法,但它们总是有 -init... 方法。在任何情况下,便捷方法都会为您处理 alloc/init 并自动释放对象。有些人对自动释放非常固执,但我发现合理使用自动释放是可以接受的,并且通常可以简化代码。如果您不完全了解 Objective-C 内存管理,那是我要学习的第一件事。
【解决方案2】:

如果您想获取当前日期,您可以使用:

NSDate * now = [NSDate date];

如果你想保留它,那么retain它。

NSDate * now = [[NSDate date] retain];

你不能用 init 重置NSDate,init 仅用于第一次初始化对象。

你可以再找一个日期:

NSDate * now = [[NSDate date] retain];
// use the now object
// need new date
[release now];
now = [[NSDate date] retain];
// once you don't need it release it
[now release];

date 消息返回autoreleasedNSDate 实例,因此返回releaseautorelease

autorelease 用于您不想担心需要在哪里释放对象的情况 - 它被放入autorelease pool。自动释放池中的对象在事件循环迭代结束后或当您在池上调用释放时释放...(有关内存管理的更多信息,请参阅 Apple 文档)。

顺便说一句。 [NSDate date] 是一种方便的方法,它可能类似于(不保证完全相同但功能相似):

- (NSDate *)date
{
    return [[[NSDate alloc] init] autorelease];
}

【讨论】:

  • +1 因为我看到你还没有“死灵法师”徽章。 =P
  • 我只是在回答一些其他问题,我注意到这个问题在左侧问题列表的顶部,所以我跳了起来……但还是谢谢
猜你喜欢
  • 2011-05-11
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
相关资源
最近更新 更多