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

Iphone 从[NSDateComponents:fromDate:toDate:options:]释放NSdate时出错,iphone,nsdate,nsdatecomponents,Iphone,Nsdate,Nsdatecomponents,好的,我有一个叫做“事件”的课程 它有一个名为eventDate的属性,它是一个NSDate。我使用了一种方法返回自事件日期起的年份: - (double)yearsSinceEvent { double years; // Get the system calendar NSCalendar *sysCalendar = [NSCalendar currentCalendar]; // Create the NSDates NSDate *date1

好的,我有一个叫做“事件”的课程

它有一个名为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]];
但这就产生了一个错误:

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

我做错了什么

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

如果我改为在cell配置方法中使用yearsSinceEvent代码,并且不发布日期1和日期2,那么它可以工作


我该怎么做呢?

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

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

在这种情况下,您不应发布
date1
date2

date2
使用工厂方法创建,并将自动删除。
date1
是您从另一个属性中读取而不保留它的内容,因此您不应释放该属性或self.eventDate将被释放

如果您拥有一个对象,您将获得该对象的所有权 使用名为 以“alloc”或“new”开头,或 包含“复制”(例如,alloc, newObject或mutableCopy),或者 向它发送一条保留消息。你是 负责放弃 您拥有的对象的所有权使用 释放或自动释放。其他时间 你收到一个对象,你不能 放开它


在这种情况下,您不应发布
date1
date2

date2
使用工厂方法创建,并将自动删除。
date1
是您从另一个属性中读取而不保留它的内容,因此您不应释放该属性或self.eventDate将被释放

如果您拥有一个对象,您将获得该对象的所有权 使用名为 以“alloc”或“new”开头,或 包含“复制”(例如,alloc, newObject或mutableCopy),或者 向它发送一条保留消息。你是 负责放弃 您拥有的对象的所有权使用 释放或自动释放。其他时间 你收到一个对象,你不能 放开它


谢谢大家!我觉得自己很愚蠢。我应该看到的。复制了代码并对其进行了更改。。我不是舒尔,为什么我在移除释放时返回0。。我认为我保留了NSDate值。。回家后我会检查。方法返回0的原因是[conversionInfo year]返回NSInteger。我把我的替身改成了NSIntegers,效果很好!谢谢大家!我觉得自己很愚蠢。我应该看到的。复制了代码并对其进行了更改。。我不是舒尔,为什么我在移除释放时返回0。。我认为我保留了NSDate值。。回家后我会检查。方法返回0的原因是[conversionInfo year]返回NSInteger。我把我的替身改成了NSIntegers,效果很好!