2017-11-21 5 views
0

이 코드 줄까지 좁혀졌지만 충돌을 피할 수있는 방법을 이해하지 못했습니다.JSON 데이터에서 NSString에 NSString을 할당 할 때 크래시가 발생합니다.

NSString *variantImageUrl = variantEdge[@"node"][@"image"][@"src"]; 

SRC의 값은

2017-11-21 17:23:27.023988+0800 NWMPos[3218:2124447] -[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance 0x1b2a01650 
2017-11-21 17:23:27.026199+0800 NWMPos[3218:2124447] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance 0x1b2a01650' 

만큼 SRC의 값이

잘 작동 적절한 문자열입니다 그러나 나는이 할 수없는 다음과 같은 오류 메시지가 널 (null) 응용 프로그램이 충돌하는 경우 충돌을 피할 수 있도록 할당하기 전에 null 값을 확인하십시오.

+1

는 것 같다'그 variantEdge [ "이미지"@] [ "노드"@] '또는'variantEdge [@ "node"]'가 null입니다. https://stackoverflow.com/questions/15237199/nsnull-objectforkeyedsubscript-unrecognized-selector-sent-to-instance를 확인하십시오. – Larme

+0

아. 무슨 뜻인지 알지. src가 null이지만 실제로 키 전체가 사라 졌다고 생각 했어. 이미지 자체가 null 인거 같아. 그걸 테스트하는 방법을 모르겠다. 링크를 읽었지 만 여전히 혼란 스럽네. –

+0

https://stackoverflow.com/questions/4839355/checking-a-null-value-in-objective-c-that-has-been-returned-from-a-json-string? 이전 링크 응답의 카테고리를 사용하는 경우, null 대신 'variantEdge [@ "node"]'에 대해 nil을 반환해야하며 충돌이 발생하지 않아야합니다. – Larme

답변

1

추가 널 (null)에 대한 검사 : 오류 메시지에 따르면 지옥 같은

if(![variantEdge[@"node"][@"image"][@"src"] isEqual:[NSNull null]]) 
{ 
    NSString *variantImageUrl = variantEdge[@"node"][@"image"][@"src"]; 
} 
0

서투른하지만

NSDictionary *dict = variantEdge; 

for (NSString *key in @[@"node", @"image"]) { 
    dict = dict[key]; 
    if (![dict isKindOfClass:NSDictionary.class]) { 
     dict = nil; 
     break; 
    } 
} 

NSString *url = dict ? dict["src"] : nil; 
관련 문제