在iOS 5中,N实体上的设置值会爆炸,但在iOS 6中不会爆炸

在iOS 5中,N实体上的设置值会爆炸,但在iOS 6中不会爆炸,ios,ios5,ios6,Ios,Ios5,Ios6,因此,我有一种方法可以下载“皮肤”我的应用程序的图像URL。它已经在iOS5中工作了几个月,我在xcdatamodel中的实体中添加了一个string类型的新属性,它停止了工作。即使我删除了属性,它仍然不起作用 当我清理xcode并从iPad上删除应用程序时,然后启动应用程序 在iOS 5中,我得到了这个错误:“线程1:EXC\u BAD\u ACCESS(code=1,address=0x1)”,如果我跟踪堆栈跟踪,这会发生在调用setValue:forKey:的点上 但是,如果我在iOS 6

因此,我有一种方法可以下载“皮肤”我的应用程序的图像URL。它已经在iOS5中工作了几个月,我在xcdatamodel中的实体中添加了一个string类型的新属性,它停止了工作。即使我删除了属性,它仍然不起作用

当我清理xcode并从iPad上删除应用程序时,然后启动应用程序

在iOS 5中,我得到了这个错误:“线程1:EXC\u BAD\u ACCESS(code=1,address=0x1)”,如果我跟踪堆栈跟踪,这会发生在调用
setValue:forKey:
的点上

但是,如果我在iOS 6中进行清理和运行,则效果良好

- (void)fetchSkinWithCompletion:(void (^)(void))completionBlock failure:(void (^)(void))failureBlock {
    NSString *skin = [self skinName];

    if (skin) {
        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/skin/%@", BASE_URL, skin]];
        NSURLRequest *request = [NSURLRequest requestWithURL:url];
        NSURLResponse *response = nil;
        NSError *error = nil;

        NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

        if (!error) {
            NSError *jsonError = nil;
            NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableLeaves error:&jsonError];

            if (!jsonError) {
                Skin *s = (Skin *)[Skin findFirstObjectByAttribute:@"name" withValue:skin inContext:[AppDelegate moc]];
                if (s == nil) {
                    s = [NSEntityDescription insertNewObjectForEntityForName:@"Skin" inManagedObjectContext:[AppDelegate moc]];
                }

                for (NSString * key in json) {
                    /******** THIS IS WHATS BLOWING UP IN iOS 5 *************/
                    [s setValue:[json objectForKey:key] forKey:key];
                }

                [[AppDelegate moc] save:nil];

                self.selectedSkin = s;
                [self downloadImageAssetsForSkin:self.selectedSkin completionBlock:completionBlock];
                return;
            } else {
                DLog(@"Error parsing JSON:%@", jsonError);
            }
        } else {
            DLog(@"User with Device ID:%@ failed fetch skin with error:%@.", [AppDelegate uniqueID], error);
        }
    }

    failureBlock();
    return;
}
findFirstObjectByAttribute:withValue:inContext
是对NSManaged对象的添加

+ (NSManagedObject *)findFirstObjectByAttribute:(NSString *)attr_name withValue:(id)value inContext:(NSManagedObjectContext *)context {
    NSFetchRequest *fetch = [[NSFetchRequest alloc] initWithEntityName:NSStringFromClass([self class])];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", attr_name, value];
    fetch.predicate = predicate;
    fetch.fetchLimit = 1;

    NSError *error = nil;
    NSArray *results = [context executeFetchRequest:fetch error:&error];
    if (results.count > 0) {
        return [results objectAtIndex:0];
    }
    return nil;
}

这最终成为核心数据的一个bug

如果其他人遇到这个问题,我的解决方案非常“脆弱”

删除实体并将其添加回没有任何作用(无法解决该问题)。然而,我的一位同事在xcdatamodel“foobar”中添加了另一个属性,但没有动态或任何数据模型上的内容,它似乎运行良好。但是,如果我删除“foobar”,xcdatamodel将不再工作(仅适用于ios5)

希望这能帮助遇到此问题的任何人


另外,如果你有关于这个错误的信息,或者更好的修复方法,请发布它。我真的很想对这个bug有一个深入的了解,并有一个“真正的”修复。

需要从你的
Skin
类中获得一些代码。具体来说,
+findFirstObjectByAttribute:withValue:inContext:
do是什么?更新了,希望有帮助。您的核心数据堆栈设置是什么样的?你只有一个上下文吗?我无法回复你的评论,因为我没有发布足够的内容,但我也遇到了同样的问题。不幸的是,在找到相同的解决方案后,我找到了您的答案。你的回答确实帮助我澄清了我并没有完全疯掉。当我在实体上设置属性时,出现了我的问题。我发现这是按字母顺序排列的第一处房产。我的是“资产”,我把它改成了“名字”。然后属性“desc”将抛出相同的错误。因此,我添加了属性“blah”,现在在iOS5.1中一切正常。iOS6+一直在工作,只是iOS5.1导致了pr