[英]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.