的NSDate初始化的问题,在Objective-C

问题描述:

内存管理相关的我有的NSDate初始化的问题,在Objective-C

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

创建一个NSDate对象后来,我想重置日期“现在”,所以我认为

[date init]; 

date = [date init]; 

可能做的工作,但他们没有。相反,

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

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

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

由于date已分配,是不是只需要一个init消息?

+1

日期是不变的,不能改变。如果你想现在的时间,你需要创建一个新的日期。请参阅Quinn的答案,具体如下:init。在任何给定的对象上多次调用init总是一个编程错误。 – 2009-08-06 19:39:19

allocinit想象为构造函数的逻辑不可分的一半。您只能在给定对象上调用以“init”开头的方法一次 - 一旦对象已初始化,并且再次初始化该对象时出错。对于任何Objective-C对象都是如此,而不仅仅是NSDate。但是,NSDate对象也是不可变的 - 一旦创建,它们就不能改变。

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

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

+0

那么对于Objective-C哪个更“惯用”呢?要使用'[NSDate date]'和'retain',或者上面的[[[NSDate alloc] init]'和'release'? – 2009-08-06 20:23:38

+0

没有哪一种更通俗易懂,它取决于你想要的东西。但是,并不是所有的类都有“便利构造函数”方法,但它们总是会有-init ...方法。在任何情况下,便捷方法都会为你处理alloc/init并自动释放对象。有些人对autorelease非常坚决,但我发现合理使用autorelease是可以接受的,并且通常会简化代码。如果你完全不了解Objective-C的内存管理,这是我首先研究的内容。 – 2009-08-06 21:56:13

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

NSDate * now = [NSDate date]; 

如果你想保留它然后retain它。

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

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

你可以只得到另一日期:

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消息返回NSDateautoreleased实例,因此releaseautorelease

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

Btw。该[NSDate date]是一种方便的方法,它可能像(不quaranteed是完全一样的,但功能类似):

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

+1因为我看到你还没有“死灵法师”徽章。 = P – 2010-01-27 04:18:09

+0

我刚刚回答了一些其他问题,我注意到这个问题在左侧问题列表的顶部,所以我跳了起来......但无论如何感谢 – stefanB 2010-01-27 04:21:58