我知道获得新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
答案 0 :(得分:2)
您的第一个问题是您通过分配dateFromStr
对象来声明NSDate
,然后在将第一次调用的结果分配给dateFromStr:
时泄漏该对象。你可以这样简化(并消除泄漏):
NSDate *dateFromStr = [dateFormatter dateFromString:self.releaseDate];
您需要了解的是,您没有分配此对象,因此您无需释放它。除非你调用类似alloc
的方法(并且还有其他一些方法;搜索SO以获取有关内存管理的其他帖子),否则您不负责发布该对象。
因此,在您发布的代码中,最后一行是释放您未分配并导致错误的对象。
答案 1 :(得分:0)
而不是
NSDate *dateFromStr = [[NSDate alloc] init];
// produce date object
dateFromStr = [dateFormatter dateFromString:self.releaseDate];
你应该只使用
NSDate *dateFromStr = [dateFormatter dateFromString:self.releaseDate];
否则,您将覆盖该对象并丢失旧对象的地址。 在那之后,你试图用你的手释放新的,然后有一个垃圾收集器尝试释放它。而你的第一个分配对象正在泄漏。
答案 2 :(得分:0)
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];
这里您正在向已经[自动释放]的对象发送[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];