0

好的,所以我得到了这个名为 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 它可以工作..

我该怎么做?

4

2 回答 2

2

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

Cocoa 内存管理规则

如果您使用名称以“alloc”或“new”开头或包含“copy”(例如,alloc、newObject 或 mutableCopy)的方法创建对象,或者向其发送保留消息,则您将获得对象的所有权。您有责任放弃使用 release 或 autorelease 拥有的对象的所有权。任何其他时间您收到一个对象,您都不能释放它。

于 2010-07-22T07:35:39.193 回答
1

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

于 2010-07-22T07:30:36.497 回答