簡體   English   中英

NSDate將init和getting消息發送到解除分配的實例

[英]NSDate alloc init & getting message sent to deallocated instance

我知道獲得新NSDate的首選方式是[NSDate date]。 但我只是困惑為什么以下代碼會拋出異常“消息發送到解除分配的實例”

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中,由另一個viewcontroller用作“虛擬”視圖。類似於此: http//cocoawithlove.com/2009/01/multiple-virtual-pages-in-uiscrollview.html

您的第一個問題是您通過分配NSDate對象來聲明dateFromStr ,然后在將第一次調用的結果分配給dateFromStr:時泄漏該對象dateFromStr: 你可以這樣簡化(並消除泄漏):

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

您需要了解的是,您沒有分配此對象,因此您無需釋放它。 除非你調用像alloc這樣的方法(還有其他幾個;搜索SO以獲取有關內存管理的其他帖子),否則你不負責釋放該對象。

因此,在您發布的代碼中,最后一行是釋放您未分配的對象並導致您的錯誤。

代替

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

你應該只使用

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

否則,您將覆蓋該對象並丟失舊對象的地址。 在那之后,你試圖用你的手釋放新的,然后有一個垃圾收集器嘗試釋放它。 而你的第一個分配對象是泄漏。

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

在這里你創建了一個dateFromStr,讓我們稱他為“John”。

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];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM