NSDate init问题,与Objective-C中的内存管理有关

Jes*_*der 4 memory-management initialization objective-c nsdate

我有一个NSDate创建的对象

NSDate *date = [[NSDate alloc] init];
Run Code Online (Sandbox Code Playgroud)

后来,我想把日期重置为"现在",所以我想到了

[date init];
Run Code Online (Sandbox Code Playgroud)

要么

date = [date init];
Run Code Online (Sandbox Code Playgroud)

可能会做这个工作,但他们没有.代替,

[date release];
date = [[NSDate alloc] init];
Run Code Online (Sandbox Code Playgroud)

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

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

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

Qui*_*lor 9

想想allocinit一个构造函数在逻辑上不可分割的两部分.您只能在给定对象上调用一次以"init"开头的方法 - 一旦初始化了对象,再次初始化它就是一个错误.对于任何Objective-C对象都是如此,而不仅仅是NSDate.但是,NSDate对象也是不可变的 - 一旦创建,它们就无法更改.

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

请注意,如果您收到某人的某个对象,则该对象已初始化.(如果不是,那么在提供它的代码中出现编程错误,或者是规则的一个非常罕见的例外.)


ste*_*anB 5

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

NSDate * now = [NSDate date];
Run Code Online (Sandbox Code Playgroud)

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

NSDate * now = [[NSDate date] retain];
Run Code Online (Sandbox Code Playgroud)

您无法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];
Run Code Online (Sandbox Code Playgroud)

date消息返回autoreleased实例NSDate,因此releaseautorelease.

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

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

- (NSDate *)date
{
    return [[[NSDate alloc] init] autorelease];
}
Run Code Online (Sandbox Code Playgroud)