我的 UITableViewController 子类中有以下方法:
-(void)populateDataStorage{
NSString *path = [[NSBundle mainBundle] pathForResource:@"FakeData" ofType:@"plist"];
if(path){
NSArray *plistData = [[NSArray alloc] initWithContentsOfFile:path];
NSEnumerator *enumerator = [plistData objectEnumerator];
NSArray *personResults;
Photo *photo;
Person *person;
id currItem = [enumerator nextObject];
while (currItem != nil) {
photo = (Photo *)[NSEntityDescription insertNewObjectForEntityForName:@"Photo" inManagedObjectContext: [[FlickrFetcher sharedInstance] managedObjectContext]];
photo.name = [currItem objectForKey:@"name"];
photo.path = [currItem objectForKey:@"path"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", [currItem objectForKey:@"user"]];
personResults = [[FlickrFetcher sharedInstance] fetchManagedObjectsForEntity:@"Person" withPredicate:predicate];
if ([personResults count] > 0) {
person = [personResults objectAtIndex:0];
}
else {
person = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:[[FlickrFetcher sharedInstance] managedObjectContext]];
person.name = [currItem objectForKey:@"user"];
}
photo.person = person;
[person addPhotosObject:photo];
NSLog(@"Photo %@ added for user %@", photo.name, person.name);
currItem = [enumerator nextObject];
}
[plistData release];
}
我在我的 AppDelegate 的 didFinishLaunchingWithOptions 方法中调用它,该方法也在同一个 AppDelegate 中,当它被调用时,我在调试时得到它说的错误,如果我不调试该行,它将运行方法和加载没有问题。如果我根本不调试,它就不会调用该方法。
编辑:根据答案更改了代码,问题仍然存在,如果我只是运行什么也没有发生,但在调试时出现错误。当我调试整个方法时,没有显示任何错误。
最佳答案
您对 NSLog
的调用试图访问您的 person
变量的 name
属性。然而,当你声明你的 person
变量时,你没有初始化它,所以它指向垃圾。你只在你的 else
子句中给它一个有效值,所以有时你的 NSLog 正在访问一个未初始化的对象。
关于ios - 程序收到信号 : EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6616273/