我正在使用coreData处理App,我得到一个我无法理解的错误:在自定义初始化我是否使用“self.controller = new_controller”定义NSFetchedResultController一切正常,如果我只定义“controller = new_controller“(没有自我),错误”NSManagedObject已经失效“发生在此图像中描述的情况的2个循环之后:
此处描述了对此错误感兴趣的应用程序部分:
包含月份列表的表 (类MonthListVC,图像中的第1步)。哪里 部分描述月(如四月 2011)和任何独特的行 部分现有数据(即总和 来自于期间发生的交易 月)。
选择其中一个行下一个 表格在导航中被推送 控制器 (类WeekTVC,图像中的第2步),此表显示 所选月份每周的详细信息。此部分标题的格式为“周开始 - 周末”,该部分的唯一行是本周的交易总和。
NSManagedObjectContext 通过自定义init方法传递(检查代码)
管理这些表的每个数据 的 NSFetchedResultController
这里是第一个表(MonthListVC)上选择的代码
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:indexPath.section];
// get the first object for this section and get its date.
NSDate *datepoint = [[[sectionInfo objects]objectAtIndex:0] date];
//Create next Controller and push it into Navigation
WeeksTVC *weeksTVC = (WeeksTVC*)[[WeeksTVC alloc] initWithContext:self.context datepoint:datepoint withTitle: [sectionInfo name] ];
[self.navigationController pushViewController:weeksTVC animated:YES];
[weeksTVC release];
}
这里是WeeksTVC自定义初始化方法的代码,我定义了“self.controller = ...”,我在哪里得到问题是否只写“controller = ...”。 “控制器”是一种综合属性。
-(WeeksTVC *)initWithContext:(NSManagedObjectContext *)n_context datepoint:(NSDate*)n_datePoint withTitle:(NSString*) stringTitle{
self = [self init];
if(self !=nil){
self.title = [NSString stringWithFormat:@"History (%@)",stringTitle];
//Back button setup
UIBarButtonItem *barButton = [[UIBarButtonItem alloc] init];
barButton.title = @"Back";
self.navigationItem.backBarButtonItem = barButton;
//datePoint = n_datePoint;
self.context = n_context;
//Get Begin and End week information for this datePoint
NSDate *startDay = [[CommonHelper weekInfoFromData:[CommonHelper firstDayOfMonthForDate:n_datePoint]] objectForKey:@"begin"];
NSDate *endDay = [[CommonHelper weekInfoFromData:[CommonHelper lastDayOfMonthForDate:n_datePoint]] objectForKey:@"end"];
//Manage Request
NSFetchRequest *request = [[NSFetchRequest alloc]init];
request.entity = [NSEntityDescription entityForName:@"Transactions" inManagedObjectContext:self.context];
request.predicate = [NSPredicate predicateWithFormat:@"(date >= %@) && (date <= %@)",startDay,endDay];
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO];
NSArray *sortDescs = [NSArray arrayWithObjects:sort,nil];
request.sortDescriptors = sortDescs;
"HERE THE PROBLEM WITH SELF***********************************************"
//Manage NSResultFetchedController
self.controller = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.context sectionNameKeyPath:@"byWeek" cacheName:nil];
self.controller.delegate = self;
NSError *error = nil;
//Fetch
[self.controller performFetch:&error];
"END OF PROBLEM***********************************************************"
[request release];
[barButton release];
}
return self;
}
我还报告了WeeksTVC的dealloc方法,我发现如果我不在这个方法中释放上下文和控制器...如果我在init方法中写入“controller =”而不是“self.controller =”也不会发生错误“
- (void)dealloc {
//[self.datePoint release];
[self.controller release];
[self.context release];
[super dealloc];
}
为什么self.controller和controller在这种情况下如此不同?
在init方法中,我曾经写过ivar而没有自我.-'
答案 0 :(得分:0)
在Weeks TVC的自定义初始化方法中我写了
self = [self init];
而不是
self = [super init];
这引起了问题......但我很想知道究竟发生了什么......