iphone-将值设置为NSManagedObject时,应用程序崩溃,EXC_访问错误或其他一些奇怪的错误

iphone-将值设置为NSManagedObject时,应用程序崩溃,EXC_访问错误或其他一些奇怪的错误,iphone,objective-c,memory,core-data,Iphone,Objective C,Memory,Core Data,好的,下面的代码有时会在“//bug!!”下面的行中崩溃 错误是EXC_坏访问,据我所知没有僵尸负责。 应用程序仍然在同一行崩溃,即使我切换到for循环中的2行 course是一个course,它是一个NSManagedObject,包含许多卡片对象。 我想做的只是在课程中的每张卡片上设置几个属性值 奇怪的是,当我尝试在循环中记录时,错误再也没有出现。 然后,在我注释掉NSLog之后的一段时间,bug出现了 此外,MBProgressHUD在单独的线程中调用此函数,该线程显示微调器和消息。 ca

好的,下面的代码有时会在“//bug!!”下面的行中崩溃

错误是EXC_坏访问,据我所知没有僵尸负责。 应用程序仍然在同一行崩溃,即使我切换到for循环中的2行

course是一个course,它是一个NSManagedObject,包含许多卡片对象。 我想做的只是在课程中的每张卡片上设置几个属性值

奇怪的是,当我尝试在循环中记录时,错误再也没有出现。 然后,在我注释掉NSLog之后的一段时间,bug出现了

此外,MBProgressHUD在单独的线程中调用此函数,该线程显示微调器和消息。 cardView是UIViewController的一个子类

- (void)resetLearningData {

// get an array of cards
NSMutableArray *cards = [[course.card allObjects] mutableCopy];

NSDate  *newDate = [[NSDate date] copy];
NSNumber *newNum = [[NSNumber numberWithInt:0] copy];
int n = [cards count];
for (int i = 0; i < n; i++)
{
    Card *c = (Card *)[cards objectAtIndex:i];

    // attempting to solve bug below
    //NSLog(@"Setting card #%d", i); // if this line is uncommented, bug doesn't appear.
    // bug!!!!! sometimes EXC_BAD_ACCESS
    [c setNum_rep:newNum];
    [c setNext_rep:newDate];
}
[cards release];
[newDate release];
[newNum release];

// Write to Disk
NSError *error = nil;
if (![managedObjectContext save:&error]) {
    [self showMessage:[NSString stringWithFormat:@"Error resetting learning data! \n%@", [error userInfo]]];
}

[cardView reloadCourse];
[cardView reloadInterface];
}

上面的代码没有问题,我猜您在两个线程之间共享相同的NSManagedObjectContext和/或NSManagedObjects,这对Coredata来说是不允许的

您需要为后台线程创建单独的托管对象上下文,在该上下文中添加/更改托管对象,然后在两个上下文之间传递objectid


这里有一个来自Apple的很好的参考,我知道EXC_BAD_访问通常是由于对象的早期发布,尝试放置断点并调试,然后查看应用程序在哪里崩溃。此外,使用Copy属性使对象不可变。 希望其他人能帮你更多。 但是你自己调试一下,这也会在将来对你有所帮助


祝您好运

ewon-当您更改标记为索引的属性(在我的示例中也是NSNumber)时,当您更改属性值时会发生这种情况

在我的例子中,我插入了一个ID属性为零的新实体,然后在我知道“ID”并且得到相同错误时更新该实体

是否尝试删除属性上的索引复选标记

(试图发布索引检查选项的图像,但我无法-无信誉:-)


线索是“\u PF\u ManagedObject\u WillChangeValueForKeyIndex”中的错误。我也有这个问题,结果是我发现消息对象正在观察一个托管对象,并在正确地取消观察它之前解除了分配

#0  0x010efa04 in __CFBasicHashAddValue ()
#1  0x010ef866 in CFBasicHashAddValue ()
#2  0x0110b472 in CFSetAddValue ()
#3  0x00f366d2 in _PFFastMOCObjectWillChange ()
#4  0x00f364aa in _PF_ManagedObject_WillChangeValueForKeyIndex ()
#5  0x00f362f5 in _sharedIMPL_setvfk_core ()
#6  0x00f43da7 in _svfk_2 ()
#7  0x00007410 in -[CourseToolTableViewController resetLearningData] (self=0x4d69d00, _cmd=0x20144) at /Users/admin/Documents/Random15/Classes/../CourseToolTableViewController.m:181
#8  0x0000b491 in -[MBProgressHUD launchExecution] (self=0x59c96a0, _cmd=0x20b08) at /Users/admin/Documents/Random15/Classes/MBProgressHUD.m:474
#9  0x00270d4c in -[NSThread main] ()
#10 0x00270cd8 in __NSThread__main__ ()
#11 0x940b985d in _pthread_start ()
#12 0x940b96e2 in thread_start ()