0

したがって、アプリを「スキン」する画像の URL をダウンロードする方法があります。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:inContextNSManaged 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

これはコアデータのバグでした。

他の誰かがこの問題に遭遇した場合、ここに私の非常に「脆い」解決策があります。

エンティティを削除して追加しても何も起こりませんでした (解決しませんでした)。しかし、私の同僚の 1 人が、データ モデルにダイナミックや何も指定せずに xcdatamodel "foobar" に別の属性を追加しましたが、問題なく動作しているようです。ただし、「foobar」を削除すると、xcdatamodel は機能しなくなります (ios5 のみ)。

この問題が発生しているすべての人に役立つことを願っています。

また、このバグに関する情報、またはより良い修正をお持ちの場合は、投稿してください。このバグをしっかりと理解し、「実際の」修正を行いたいと思っています。

于 2013-01-22T01:34:13.337 に答える