0

所以我有一种方法可以下载“皮肤”我的应用程序的图像的网址。它已经在 iOS 5 中运行了几个月,我在我的 xcdatamodel 中的实体中添加了一个字符串类型的新属性,但它停止了工作。即使我删除了该属性,它仍然不起作用。

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

在 iOS 5 中,我收到此错误:“线程 1:EXC_BAD_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 Object 的补充。

+ (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;
}
4

1 回答 1

0

这最终成为核心数据的错误。

万一其他人遇到这个问题,这是我非常“脆弱”的解决方案。

删除和添加实体什么也没做(没有解决它)。但是,我的一位同事向 xcdatamodel“foobar”添加了另一个属性,而数据模型上没有动态或任何内容,它似乎运行良好。但是,如果我删除“foobar”,xcdatamodel 将不再工作(仅适用于 ios5)。

希望对遇到此问题的人有所帮助。

此外,如果您有关于此错误的信息或更好的修复,请发布。我真的很想对这个错误有深入的了解,以及一个“真正的”修复。

于 2013-01-22T01:34:13.337 回答