2010-10-29 112 views
2

我是新来的ObjC和更新的CoreData。我试图找到解决这个问题的答案,但从来没有得到什么发生在我身上。 我初始化我的控制器的loadView管理对象是这样的:核心数据的动态属性

NSError *error; 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName: @"Info" 
       inManagedObjectContext: [self managedObjectContext]]; 
    [request setEntity: entity]; 

    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; 
    if (mutableFetchResults == nil) 
    { /* Handle the error. */ } 
    else 
    { 
    if([mutableFetchResults count] == 1) 
    { 
    info = (Info*) [mutableFetchResults objectAtIndex: 0 ]; 
    } 
    else if([mutableFetchResults count] == 0) 
    { 
    info = (Info*) [NSEntityDescription insertNewObjectForEntityForName:@"Info" 
       inManagedObjectContext:[self managedObjectContext]]; 
    [info setEventsArray: [[[NSArray alloc] init] autorelease]]; 
    [info setName:@"Holas"]; 
    if (![managedObjectContext save:&error]) 
    {/* Handle the error. */} 
    else 
    { 
    NSString *name = [info name]; 
    NSArray *array = (NSArray*)[info eventsArray]; 
    int a = [array count]; 
    DebugStr(@"", a, name); 
    } 
    } 
    else 
    {/* Handle the error. */} 
    }; 
    [mutableFetchResults release]; 
    [request release]; 

当刚刚DebugStr之前检查在这里,我可以正常访问的属性名称和eventsArray。 现在,处理和使用下面的代码的事件(在同一个控制器的成员)时:

Info *myInfoObj = [self info]; 
NSString *name = [myInfoObj name]; 
NSArray *anEventsArray = (NSArray*)[myInfoObj eventsArray]; 
DebugStr(@"", name, [anEventsArray count]); 

...访问“名称”抛出一个异常,由于访问者的是无法识别的。 我很疑惑Info的(信息是从NSManagedObject派生的)访问器是如何在一个上下文中识别的,而不是在另一个上下文中识别的。是动态的(我认为在运行时)生成访问器缓存?我用XCode自动生成了Info,我错过了什么? 预先感谢任何线索。

回答

2

看来问题在于,您从获取中获取的“信息”对象不会保留。当mutableFetchResults数组被释放时,对象被释放并释放。访问dealloc'ed可能会导致无法识别的方法异常等症状。

希望它有帮助... 凸轮

+0

嗨凸轮,这是这个把戏。回想起来,这似乎是合乎逻辑的,因为insertNewObjectForEntityForName没有任何标志说我拥有它的返回对象。然而,它是吸引人的(并且误导),异常抛出的异常不是空对象解引用(这是对动态类型语言的重复吗?)。 – NuBie 2010-10-29 13:42:36

+0

嗨NuBie,如果Cam的答案解决了这个问题,很高兴选择它作为正确答案 - 只需点击Cam答案左边的复选框即可。干杯 – quantumpotato 2011-05-02 20:02:04