为什么我的应用程序因为Core Data请求执行而在iPhone 4S上崩溃?

时间:2013-04-18 00:06:35

标签: ios core-data

我有一个在模拟器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上?它没有提供控制台日志,也没有上面介绍的最后一个知道方法。这是一张照片:

enter image description here

如上所述,如果我取消注释NSLog线,它就会记录到数组,如图所示。如果我把它留在那里就停在那条线上。

2 个答案:

答案 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。