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

时间:2010-07-22 07:15:12

标签: iphone nsdate nsdatecomponents

好的,所以我得到了这个叫做事件的clas。

它有一个名为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;
}

在配置我的tableview单元格时,我会这样做:

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它可以工作..

我该怎么做?

2 个答案:

答案 0 :(得分:2)

在这种情况下,您不应该发布date1date2 date2是使用工厂方法创建的,将自动释放 date1是您从另一个属性中读取的内容,但不保留它,因此您不应释放该属性,否则将释放self.eventDate。

Cocoa Memory Management Rules

  

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

答案 1 :(得分:1)

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