好的,所以我得到了这个叫做事件的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它可以工作..
我该怎么做?
答案 0 :(得分:2)
在这种情况下,您不应该发布date1
和date2
date2
是使用工厂方法创建的,将自动释放
date1
是您从另一个属性中读取的内容,但不保留它,因此您不应释放该属性,否则将释放self.eventDate。
如果您拥有对象的所有权 使用名称为的方法创建它 以“alloc”或“new”开头 包含“复制”(例如,alloc, newObject,或mutableCopy),或者如果你 发送一条保留信息。你是 负责放弃 您拥有的对象的所有权 释放或自动释放。任何其他时间 你收到一个物品,你绝对不能 释放它。
答案 1 :(得分:1)
您不应该发布date1和date2,因为它们已经自动释放。确保将eventDate ivar正确声明为保留属性:它应为@property (nonatomic, retain) NSDate *eventDate;