从 [NSDateComponents components: fromDate: toDate: options:] 释放 NSdate 时出错

Posted

技术标签:

【中文标题】从 [NSDateComponents components: fromDate: toDate: options:] 释放 NSdate 时出错【英文标题】:Error when releasing NSdate from [NSDateComponents components: fromDate: toDate: options:] 【发布时间】:2010-07-22 07:15:12 【问题描述】:

好的,所以我得到了这个名为 event 的类。

它有一个名为 eventDate 的属性,它是一个 NSDate。我做了一个方法来返回距离事件日期有多少年:

- (double)yearsSinceEvent 
    double years;

    // Get the system calendar
    NSCalendar *sysCalendar = [NSCalendar currentCalendar];

    // Create the NSDates
    NSDate *date1 = self.eventDate; 
    NSDate *date2 = [NSDate  date];


    // Get conversion to months, days, hours, minutes
    unsigned int unitFlags = NSYearCalendarUnit;

    NSDateComponents *conversionInfo = [sysCalendar components:unitFlags fromDate:date1  toDate:date2  options:0];

    years = [conversionInfo year];

    [date1 release];
    [date2 release];

    return years;

当我配置我的表格视图单元格时:

cell.textLabel.text = [[events objectAtIndex:indexPath.row] name];
cell.detailTextLabel.text = [NSString stringWithFormat:@"%d year's ago", [events objectAtIndex:indexPath.row] yearsSinceEvent]];

但这会引发此错误:

*** __NSAutoreleaseFreedObject(): 先前释放的对象 (0x595bda0) 的释放被忽略

我在这里做错了什么?

如果我不发布 date1 和 date2 我不会得到错误,但该方法返回 0..

如果我改为在单元格配置方法中执行 yearsSinceEvent 代码,并且不发布日期 1 和日期 2 它可以工作..

我该怎么做?

【问题讨论】:

【参考方案1】:

在这种情况下,您不应释放 date1date2date2 是使用工厂方法创建的,将被自动释放。date1 是您从另一个属性中读取但未保留的内容所以你不应该释放那个或者 self.eventDate 将被释放。

Cocoa Memory Management Rules

如果你拥有一个对象的所有权 使用其名称的方法创建它 以“alloc”或“new”或 包含“copy”(例如,alloc, newObject 或 mutableCopy),或者如果您 向其发送保留消息。你是 负责放弃 您拥有的对象的所有权 释放或自动释放。任何其他时间 你收到一个对象,你不能 释放它。

【讨论】:

谢谢大家!我觉得我好笨。应该看到的。复制代码并更改它..我不知道为什么在删除版本时我得到 0 ..我确实认为我保留了 NSDate 值..我回家时会检查.. 该方法返回 0 的原因是 [conversionInfo year] 返回一个 NSInteger。我把我的替身换成了 NSIntegers,效果很好!【参考方案2】:

您不应发布 date1 和 date2,因为它们已经自动发布。确保您的 eventDate ivar 被正确声明为保留属性:它应该是 @property (nonatomic, retain) NSDate *eventDate;

【讨论】:

以上是关于从 [NSDateComponents components: fromDate: toDate: options:] 释放 NSdate 时出错的主要内容,如果未能解决你的问题,请参考以下文章

从 String 创建 DateComponents / NSDateComponents,反之亦然

将 NSDateComponents 与整数进行比较(或将 NSDateComponents 转换为整数)

NSDateComponents 不返回日期

从 [NSDateComponents components: fromDate: toDate: options:] 释放 NSdate 时出错

在 NSDateComponents 中获取 NSCalendarUnits 的数量

如何在两个 NSDateComponents 之间获取 NSDateComponents?