我具有由

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

后来,我想重置日期“现在”,所以我觉得

[date init];

date = [date init];

可能做的工作,但他们没有。取而代之的是,

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

的工作原理。我有点糊涂了这一点,因为对于- (id) init的文档中,它说:

  

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

和自date已经被分配,不应该它只需要一个init消息?

有帮助吗?

解决方案

想到alloc的和init构造的为逻辑上不可分的两半。你只能叫用“初始化”给定对象上开始一次方法 - 一旦对象已经被初始化,这是一个错误重新初始化。这对于任何Objective-C的对象,而不仅仅是NSDate的是真的。然而,NSDate的对象也的不可变 - 一旦创建,它们不能改变

后者的代码工作的原因是因为你创建NSDate的,这是应该做的正确事情的新实例。您也可以使用[NSDate的日期]来完成同样的事情。要知道,它返回你(还)没有自己的对象,所以你需要保留它,如果你需要保持它周围,后来释放它。

请注意,如果您收到来自某人的对象,它已经被初始化。 (如果不是,它是在所提供,或者是一个非常罕见例外代码中的编程错误。)

其他提示

如果你想获得你可以使用当前日期:

NSDate * now = [NSDate date];

如果你想保持它,然后它retain

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

可以不复位NSDate以init时,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。在自动释放池对象的事件循环迭代结束后释放,或当你调用池释放...(看更多的内存管理苹果文档)。

顺便说一下。所述[NSDate date]是一个方便的方法,它可能是这样(未quaranteed是完全相同的,但功能上类似于):

- (NSDate *)date
{
    return [[[NSDate alloc] init] autorelease];
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top