NSDate alloc init&将消息发送到解除分配的实例

时间:2011-07-28 20:19:48

标签: iphone ios nsdate

我知道获得新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

3 个答案:

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