在没有self.propertyname的情况下访问属性会导致错误

时间:2011-04-08 09:20:40

标签: objective-c ios

我正在使用coreData处理App,我得到一个我无法理解的错误:在自定义初始化我是否使用“self.controller = new_controller”定义NSFetchedResultController一切正常,如果我只定义“controller = new_controller“(没有自我),错误”NSManagedObject已经失效“发生在此图像中描述的情况的2个循环之后: Error

此处描述了对此错误感兴趣的应用程序部分:

  • 包含月份列表的表 (类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而没有自我.-'

1 个答案:

答案 0 :(得分:0)

在Weeks TVC的自定义初始化方法中我写了

self = [self init];

而不是

self = [super init];

这引起了问题......但我很想知道究竟发生了什么......