2013-01-18 1 views
0

그래서 내 앱을 "스킨"하는 URL을 다운로드하는 방법이 있습니다. 몇 달 동안 iOS 5에서 일해 왔고, xcdatamodel의 엔티티에 string 유형의 새로운 속성을 추가하여 작동을 멈췄습니다. 속성을 삭제하더라도 여전히 작동하지 않습니다.NOSntity의 설정 값은 iOS 5에서는 폭발하지만 iOS 6에서는 불어납니다.

xcode를 지우고 앱 양식을 삭제하면 iPad가 실행됩니다.

iOS 5에서 "스레드 1 : EXC_BAD_ACCESS (코드 = 1, 주소 = 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; 
} 
+0

'스킨'클래스의 코드가 필요합니다. 특히, + findFirstObjectByAttribute : withValue : inContext :'do? –

+0

업데이트 됨, 도움이 되십시오. – mwoods79

+0

핵심 데이터 스택 설정은 어떻게됩니까? 당신은 하나의 맥락 만 가지고 있습니까? – hatunike

답변

0

결국 핵심 데이터의 버그가 발생했습니다.

다른 사람이이 문제에 부딪히는 경우 여기 내 "매우 취약한"해결책입니다.

엔터티를 제거하고 추가하면 아무 것도 수행되지 않습니다 (해결하지 못함). 그러나 동료 중 한 명이 xcdatamodel "foobar"에 동적 또는 데이터 모델에 대한 다른 특성을 추가하지 않았으므로 제대로 작동하는 것 같습니다. 그러나 "foobar"를 제거하면 xcdatamodel이 더 이상 작동하지 않습니다 (ios5 만 해당).

이 문제가 발생하는 사용자를 돕기를 바랍니다.

또한이 버그 또는 더 나은 수정에 대한 정보가있는 경우 게시하십시오. 나는이 버그에 대한 확실한 이해와 "진정한"해결책을 정말 좋아할 것입니다.

관련 문제