2009-08-06 37 views
4

內存管理相關的我有的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

回答

9

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

5

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

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