4

I have an NSDate object created by

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

Later, I want to reset the date to the "now", so I thought that

[date init];

or

date = [date init];

might do the job, but they don't. Instead,

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

works. I'm a bit confused about this, since in the documentation for - (id) init, it says:

Returns an NSDate object initialized to the current date and time.

and since date is already allocated, shouldn't it just need an init message?

4

2 回答 2

9

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

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

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

于 2009-08-06T19:35:38.377 回答
5

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

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消息返回的autoreleased实例NSDate,因此返回releaseor autorelease

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

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

- (NSDate *)date
{
    return [[[NSDate alloc] init] autorelease];
}
于 2010-01-27T04:14:55.920 回答