0

我有一个在模拟器 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 行,它会一直记录数组,如图所示。如果我把它留在里面,它会停在那条线上。

4

2 回答 2

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。如果是,则存在错误,因为返回 nil表示存在错误。只有这样,你才能error有意义地触摸。

文档对此总是很清楚,尽管在关键的情况下确实会让人眼前一亮,所以我在斜体括号中添加了一些注释来指出关键点:

要求

指定提取的搜索条件的提取请求。

错误

如果执行获取时出现问题,则返回时包含描述问题的 NSError 实例。 [如果执行 fetch 没有问题,包含垃圾所以不要碰它!]

返回值

满足从接收器和与接收器的持久存储协调器关联的持久存储获取的请求指定的条件的对象数组。如果发生错误,则返回 nil。[这就是确实发生错误的标志。]如果没有对象符合请求指定的条件,则返回一个空数组。

这可能是您遇到麻烦的原因,也可能不是,但您必须立即解决。我希望您检查所有代码以查找NSError*声明用于此模式的变量并修复所有这些变量!谢谢你。本课到此结束。

于 2013-04-18T01:01:39.177 回答
0

这是在黑暗中刺伤 b/c 您尚未确定发生崩溃的代码行。我建议你设置一个断点,然后单步执行,直到你遇到崩溃。如果我在下面说的内容不能解决问题,请编辑您的帖子并添加有关崩溃发生位置的更多信息,我们将从那里开始。

这是要检查的东西。该行:

[newHoliday setValuesForKeysWithDictionary:holidayDataDictionary]

holidayDataDictionary如果其中的任何键对类的实例无效,则可能会崩溃Holiday

关于你关于为什么它只在你的 iPhone 4S 上崩溃的问题,目前还没有足够的数据来解释这一点。根据您进行测试和核心数据迁移(如果有的话)的方式,您可能在该设备上存在模型不一致,尽管我在您发布的屏幕截图中没有看到任何指向该方向的内容。我会尝试卸载/重新安装您的应用程序,看看崩溃是否仍然只是 iPhone 4S。

于 2013-04-18T01:57:52.997 回答