2011-07-28 63 views
0

我知道獲取新NSDate的首選方式是[NSDate date]。但我只是困惑,爲什麼下面的代碼將永遠拋出異常「消息發送到釋放實例」NSDate alloc初始化和獲取消息發送到釋放實例

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM/dd/yyyy"]; 
NSDate *dateFromStr = [[NSDate alloc] init]; 
// produce date object 

dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

[dateFormatter setDateFormat:@"MM.dd.yyyy"]; 
NSString *strDate = [dateFormatter stringFromDate:dateFromStr]; 

[dateFormatter release]; 
[dateFromStr release]; 

這段代碼是由另一個viewcontroller..something用作「虛擬」視圖中的視圖 - 控制與此類似:http://cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html

回答

2

你的第一個問題是,你通過分配一個NSDate對象申報dateFromStr,那麼當您將第一個呼叫dateFromStr:的結果泄露該對象。你完全可以簡化(並消除泄漏)正是如此:

NSDate *dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

你需要知道這是怎麼回事,你是不是該分配對象,所以你不需要將其釋放。除非你調用類似alloc的方法(還有其他一些方法;在其他文章中搜索關於內存管理的內容),那麼你不負責釋放該對象。

因此,在您發佈的代碼中,最後一行是釋放一個您沒有分配並導致錯誤的對象。

0

而不是

NSDate *dateFromStr = [[NSDate alloc] init]; 
// produce date object 
dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

你應該只使用

NSDate *dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

否則你覆蓋對象和鬆散舊的地址。 之後,你試圖通過你的手釋放新的,然後垃圾收集器試圖釋放它。而您的第一個分配的對象正在泄漏。

0
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateFormat:@"MM/dd/yyyy"]; 
NSDate *dateFromStr = [[NSDate alloc] init]; 
// produce date object 

在這裏,你正在創建一個dateFromStr,讓我們稱他爲「約翰」。

dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

[NSDateFormatter dateFromString]將返回一個已經自動發佈的新對象「Tom」。您已經失去對已泄漏的「John」的任何提及。

[dateFormatter setDateFormat:@"MM.dd.yyyy"]; 
NSString *strDate = [dateFormatter stringFromDate:dateFromStr]; 

[dateFormatter release]; 
[dateFromStr release]; 

在這裏,您正在向[自動釋放]的對象發送[釋放]消息。最終的結果是,你將在「Tom」上調用[release]兩次,在「John」中調用零次。

你可以重寫你的代碼是這樣的:

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"MM/dd/yyyy"]; 

// produce date object 
NSDate *dateFromStr = [dateFormatter dateFromString:self.releaseDate]; 

[dateFormatter setDateFormat:@"MM.dd.yyyy"]; 
NSString *strDate = [dateFormatter stringFromDate:dateFromStr]; 
+0

順便說一句,我想你應該嘗試閱讀了關於在Objective-C的內存管理了一點,因爲你似乎有相當多的困惑。例如,試試Apple文檔中的「內存管理編程指南」。 –

相關問題