NSDate的初始化问题,在Objective-C内存管理相关
-
11-09-2019 - |
题
我具有由
创建的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
消息返回autoreleased
的NSDate
实例,因此release
或autorelease
。
在autorelease
用于在您不想担心正是你需要在哪里释放对象的情况下 - 它被放入autorelease pool
。在自动释放池对象的事件循环迭代结束后释放,或当你调用池释放...(看更多的内存管理苹果文档)。
顺便说一下。所述[NSDate date]
是一个方便的方法,它可能是这样(未quaranteed是完全相同的,但功能上类似于):
- (NSDate *)date
{
return [[[NSDate alloc] init] autorelease];
}