推出

2011-03-05 37 views
1

請參閱此代碼:推出

-(id)MethodName:arg { 
    // some stuff 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    // some more stuff 
    [dateFormatter release]; 
} 

dateFormatter是一種方法的變量(即,不是一個實例變量;它不是在頭文件中定義)。然而,該方法正在創建一個指針並分配內存。事實證明,如果我釋放最後一行中的變量,程序崩潰,但如果不是,則工作正常。我不明白爲什麼如果我創建一個指針並分配內存,那麼不需要使用release。除此之外,我應該將dateFormatter設置爲零後使用?

+0

那是什麼東西,是怎麼回事界定呢? – BoltClock 2011-03-05 03:06:02

+1

你的問題可能在'//更多東西'的某處。你的代碼看起來非常好,否則。 – MusiGenesis 2011-03-05 03:11:50

+0

爲了將來的參考,這些變量被稱爲「局部變量」(不是方法變量)。 – 2011-03-06 16:18:33

回答

1

可能發生的情況是,您將dateFormatter傳遞給某個其他方法,只是將其轉換爲某個實例變量的assigns。然後你釋放它,有效地釋放它。最後,現在有一個對釋放內存的引用的類嘗試使用實例變量並且程序崩潰。

你應該做的是接收類retain變量,當它收到它(也release實例變量指向它的dealloc方法)。

如果你將其分配給屬性,則應與retain修改,例如:

@property (nonatomic, retain) NSDateFormatter* dateFormatter; 
+0

@Jordao:我認爲衝突的線是這樣的:'NSString * myDate = [dateFormatter stringFromDate:[NSDate date]];'然而我沒有看到你的觀點,因爲dateFormatter:stringFromDate返回一個NSString(這是一個獨立於對象從DateFormatter。但我相信你的觀點適用於以下行:'[self setSubtitle:myDate];'。在這裏,實例變量Subtitle指向myDate,這是一個方法變量,當方法結束時死亡(我以前的代碼也包含一個'[myDate release]') – ryback 2011-03-05 03:48:11

+0

Ahh,'setSubtitle'應該保留'NSString',因爲它將它賦值給一個實例變量 – 2011-03-05 03:57:07

+0

呵呵,不要釋放'myDate',你不是所有者! – 2011-03-05 03:58:37