我有一个在模拟器6.1上运行良好的应用程序,在iOS6.1上的iPhone5和iPad3上工作正常,但在iPhone4S上运行时,它会在这个方法中使用Exc Bad Access崩溃:
-(void)parsePlistIntoCD{
self.managedObjectContext = [[SDCoreDataController sharedInstance] backgroundManagedObjectContext];
// 3: Now put the plistDictionary into CD...create get ManagedObjectContext
NSManagedObjectContext *context = self.managedObjectContext;
NSError *error;
//Create Request & set Entity for request
NSFetchRequest *holidayRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *topicEntityDescription = [NSEntityDescription entityForName:@"Holiday" inManagedObjectContext:context];
[holidayRequest setEntity:topicEntityDescription];
//Create new NSManagedObject
//Holiday *holidayObjectToSeed = nil;
Holiday *newHoliday = nil;
//Execute fetch just to make sure?
NSArray *holidayFetchedArray = [context executeFetchRequest:holidayRequest error:&error];
**if (error) NSLog(@"Error encountered in executing topic fetch request: %@", error); // if I comment this line out it reaches as far as the next bold line**
// No holidays in database so we proceed to populate the database
if ([holidayFetchedArray count] == 0) {
//Get path to plist file
NSString *holidaysPath = [[NSBundle mainBundle] pathForResource:@"PreloadedFarsiman" ofType:@"plist"];
//Put data into an array (with dictionaries in it)
NSArray *holidayDataArray = [[NSArray alloc] initWithContentsOfFile:holidaysPath];
**NSLog(@"holidayDataArray is %@", holidayDataArray);**
//Get number of items in that array
int numberOfTopics = [holidayDataArray count];
//Loop thru array items...
for (int i = 0; i<numberOfTopics; i++) {
//get each dict at each node
NSDictionary *holidayDataDictionary = [holidayDataArray objectAtIndex:i];
//Insert new object
newHoliday = [NSEntityDescription insertNewObjectForEntityForName:@"Holiday" inManagedObjectContext:context];
//Parse all keys in each dict object
[newHoliday setValuesForKeysWithDictionary:holidayDataDictionary];
//Save and or log error
[context save:&error];
if (error) NSLog(@"Error encountered in saving topic entity, %d, %@, Hint: check that the structure of the pList matches Core Data: %@",i, newHoliday, error);
};
}
//set bool that specifies the coredata has been populated from plist already
NSString *bundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
NSString *appFirstStartOfVersionKey = [NSString stringWithFormat:@"first_start_%@", bundleVersion];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setObject:@(YES) forKey:appFirstStartOfVersionKey];
[prefs synchronize];
}
为什么只在4S上?它没有提供控制台日志,也没有上面介绍的最后一个知道方法。这是一张照片:
如上所述,如果我取消注释NSLog线,它就会记录到数组,如图所示。如果我把它留在那里就停在那条线上。
答案 0 :(得分:2)
NSArray *holidayFetchedArray = [context executeFetchRequest:holidayRequest error:&error];
if (error)
NSLog(@"Error encountered in executing topic fetch request: %@", error);
不不不不不。我知道这是一个困难的模式,但请让我们尝试做对。 不 if (error)
。 error
可以是任何东西(特别是非ARC)。测试是if (!holidayFetchedArray)
。
对于这些方法的所有,它们返回一个值并通过间接获取NSError**
,您可以测试结果以查看它是否为零。如果是,则出现错误,因为返回nil是符号,表示存在错误。然后,只有这样你才能有意义地触摸error
。
文档总是非常清楚这一点,尽管在关键实例中可能会出现迷雾,所以我在斜体括号中添加了一些注释来说明关键点:
请求
获取请求,指定搜索条件 取。
错误
如果在返回时执行提取时出现问题 包含描述问题的NSError实例。 [并且如果执行获取没有问题,则包含垃圾,所以不要碰它!]
返回值
符合请求指定条件的对象数组 从接收器和相关的持久存储中获取 与接收者的持久性商店协调员。如果发生错误, 返回零。 [而且,forsooth,是发生错误的标志。] 如果没有对象符合请求指定的条件, 返回一个空数组。
这可能是您遇到麻烦的原因,也可能不是,但您必须现在修复 。我希望您浏览所有代码,查找声明在此模式中使用的NSError*
变量并修复所有!谢谢。这里吸取了教训。
答案 1 :(得分:0)
这是在黑暗的b / c中你没有识别崩溃发生的代码行。我建议你设置一个断点然后一步一步,直到你遇到崩溃。如果我在下面说的内容无法解决问题,请编辑您的帖子并添加有关崩溃发生位置的更多信息,我们将从那里开始。
这是要检查的东西。这一行:
[newHoliday setValuesForKeysWithDictionary:holidayDataDictionary]
如果holidayDataDictionary
中的任何键对Holiday
类的实例无效,则可能会崩溃。
关于你为何只在你的iPhone 4S上崩溃的问题,还没有足够的数据来解释。根据您进行测试和核心数据迁移的方式(如果有的话),您可能会在该设备上出现模型不一致的情况,但我在屏幕截图中看不到任何内容,指出我指向该方向。我会尝试卸载/重新安装你的应用程序,看看崩溃是否仍然是iPhone 4S。