2015-01-27 1 views
0

내 API에서 JSON 객체를 당겨 (가늠자에 갈 수없는 방법) 다음 코드를 사용하여 만드는 오전 대 :의의 Obj-C setValuesForKeysWithDictionary 64 비트 32 비트

+ (YActivity *)instanceFromDictionary:(NSDictionary *)jsonDictionary 
{ 
    YActivity * instance = [[YActivity alloc] init]; 
    [instance setAttributesFromDictionary:jsonDictionary]; 
    return instance; 
} 

- (void)setAttributesFromDictionary:(NSDictionary *)jsonDictionary 
    { 
     if (![jsonDictionary isKindOfClass:[NSDictionary class]]) { 
      return; 
     } 

     [self setValuesForKeysWithDictionary:jsonDictionary]; 
} 

하나 키는 "유형"입니다. 읽기 전용 변수 @synthesized "type"이 있습니다. 내 앱의 32 비트 버전에서는 setValue:(id)value forUndefinedKey:(NSString *)key이 호출되기 전에 바로 설정됩니다. 이 메소드에서이 값을 참조하고 64 비트 버전의 앱에서 중단 점이이 메소드에 도달 할 때 유형이 아직 설정되지 않았습니다.

분명히 이것은 최선의 행동이 아닙니다. 나는 다른 사람이 이것을 보았는지 또는 내가 잘못된 나무를 짖고 있는지 궁금해하고있다. 나는 두 가지 버전 사이에서 파일을 엇나 봤는데 그것들은 동일하다. 나는 둘 다 iOS 8.1 Simulator에서 실행 중이며, API는 두 가지 모두 동일한 결과를 반환합니다. 기본적으로 정의 된 이전 버전의 키는 정의되지 않은 상태로 설정되며, 새 버전에서는 반대입니다.

+2

사전은 순서가 지정되지 않은 모음입니다. 코드는 사전의 키가 열거되는 순서에 대해 가정해서는 안됩니다. – jlehr

+0

예, 명확하게 여기에 잘못되었습니다. 어떤 점에서이 방법의 순서가 바뀌 었는지 아는 사람이 있는지 궁금합니다. 사전의 직렬화에 의존하는 것은 올바르지 않습니다. – JeffN

+1

'이 방법의 순서'가 의미하는 바를 잘 모릅니다. 다양한 객체 유형에 의해 생성 된 해시는 64 비트 시스템과 32 비트 시스템에서 다를 수 있으므로 사용자가 보는 차이를 설명 할 수 있습니다. – jlehr

답변

2

NSDictionary 개체는 정렬되지 않은 컬렉션이므로 코드는 사전이 자체 키를 열거하는 순서에 대한 가정을해서는 안됩니다. 해시 값이 저장되는 위치에 영향을주는 32 비트 및 64 비트 런타임 간의 구현 차이가 있음이 밝혀졌습니다.

API 계약이 명시 적으로 주문을 보장하지 않기 때문에 문제가 발생하지 않지만이 경우에는 이전에 '작동했습니다'코드가 중단 될 수있는 부작용이있을 수 있습니다 (이 경우 분명히 ). 64 비트 아키텍처 용으로 컴파일 할 때.

당신은 키의 배열은 당신이 원하는대로 주문 제공 할 수 있도록 할 당신은 크게 사전의 키를 직접 열거하는 것 구현을 변경하지 않고 발생하는 문제, 해결하는 빠른 방법 :

- (void)setAttributesFromDictionary:(NSDictionary *)dictionary 
{ 
    // So instead of doing this... 
    // 
    // [self setValuesForKeysWithDictionary:dictionary]; 

    // You could do something along these lines: 
    // 
    NSMutableArray *keys = dictionary.allKeys.mutableCopy; 

    // TODO: insert code to change the order of the keys array. 
    // Then loop through the keys yourself... 

    for (NSString *key in keys) 
    { 
     [self setValue:dictionary[key] forKey:key]; 
    } 
} 
관련 문제