2010-04-18 2 views
7

문자열이 사전에 있더라도 이 null이고 NSString 인 경우 문제가 발생합니다. 여기에 코드입니다 :objectForKey :가 올바른 문자열로 null을 반환하게하는 원인은 무엇입니까?

- (void)sourceDidChange:(NSNotification *)aNote { 
    NSDictionary *aDict = [aNote userInfo]; 
    DLog(@"%@", aDict); 
    NSString *newSourceString = [aDict objectForKey:@"newSource"]; 
    DLog(@"%@", newSourceString); 
    newSourceString = [newSourceString stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    DLog(@"%@", newSourceString); 
    NSString *inspectorString = [newSourceString stringByAppendingString:@"InspectorController"]; 
    DLog(@"%@", inspectorString); 
    newSourceString = [newSourceString stringByAppendingString:@"ViewController"]; 
    DLog(@"%@", newSourceString); 
} 

는 그리고 난 다음 로그 문을 얻을 :

2010-04-17 23:50:13.913 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] { newSource = "Second View"; } 
2010-04-17 23:50:13.914 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 
2010-04-17 23:50:13.916 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 
2010-04-17 23:50:13.917 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 
2010-04-17 23:50:13.917 CoreDataUISandbox[13417:a0f] -[RightViewController sourceDidChange:] (null) 

당신이 볼 수 있듯이, 문자열이 키 newSource에서 사전에 아직 나는 objectForKey:를 호출 할 때, I null을 얻으십시오. 나는 심지어 프로젝트를 청소하는 대체 옵션을 시도했다.

누구도이 문제를 겪어 본 적이 없습니까? 아니면 단지 기본적인 것을 잊어 버렸습니까?

+0

'aDict'를 설정하고 로깅 한 후,'DLog (@ "% @", [aDict allKeys]); – Isaac

+0

* 실제 코드입니까? 열쇠를 잘못 입력했을 가능성이 있습니까? 'DLog (@ "% @", [aDict allKeys])가주는 것은 무엇입니까? –

+0

'% @' 대신'newSourceString'을'% p'로 로깅하려고 할 수도 있습니다. –

답변

3

이 시점에서 어떤 이유로 든 DLog에서보고 오류가 발생했습니다.

보십시오 : NSLog로 로그인

  1. .
  2. 코드가 실행되는 동안 디버거에서 직접 newSourceString의 값을 확인하십시오.
2

objectForKey:은 유효한 문자열을 사용하여 null을 반환하게되는 원인은 무엇입니까? 두 가지의

하나 :

  1. 이 사전은 해당 키에 대한 객체를 포함하지 않습니다. (으로 생각하든 관계 없습니다.)
  2. 사전이 없습니다. aDictnil이므로 objectForKey: 메시지는 nil으로 전송됩니다. nil에 대한 메시지는 nil을 반환하는 것 외에는 아무 것도하지 않습니다.

당신이 문자열이 키 newSource에서 사전에 볼 수 있듯이 ... 사실

, 나는 거기에 무슨 일이 일어나고 있는지 모르겠어요. NSDictionary의 설명 (해당 키에 대한 문자열이 포함 된 경우)은 { newSource = "some string here"; }이며 기록한 설명과 일치하지 않습니다. 반면 사전이 아닌 객체 인 경우 objectForKey: 메시지를 보내려고하면 "선택자에 응답하지 않습니다"예외가 발생해야합니다. 따라서 로그 출력에서 ​​무언가 인 인 것처럼 보이지만 실제로는 사전이 아닌 것을 제외하고는 무엇인지 전혀 알지 못합니다.

그렇다면 당연히 이상합니다.

+0

내가 중괄호를 넣을 때마다 코드 블록을 망쳐 놓았으므로 삭제해야했습니다 (여전히 그 이유가 확실하지 않습니다). – theMikeSwan

+0

위의 @ theMikeSwan의 설명에 기반한 로그 문에 중괄호를 포함하도록 질문을 업데이트했습니다. –

0

나는 당신의 문자열이 문자 그대로 "(null)"이라고 생각한다. 즉, 길이가 6 자이며, (-n-u-l-l-)이라고 나와있다.

+0

인쇄의 첫 번째 줄은 키의 값이 "두 번째보기"임을 보여줍니다. – TechZen

+0

그렇다면'stringByAppendingString :'을 적용하는 단계는 여전히'(null)'을 생성하지 않아야합니다. – Isaac

+0

아무도 이것이 정말로 재미 있다고 생각하지 않았습니까? 언젠가는 내 파트너에서 장난으로 놀거야.) –

1

코딩하는 환경을 무시하지 않아도됩니다. GNUstep, 특히 gnustep1.19가있는 경우 계속 읽으십시오.그렇지 않으면 무시하십시오.

방금 ​​gnustep1.19 (.3)로 매우 이상한 버그가 발생했지만이 질문을 완벽하게 모방합니다. 이 경우

NSString * key = <some string> 
NSDictionary * dict = <some dictionary> 

(gdb) p [dict objectForKey:key] 
$20 = (struct objc_object *) 0x0 
(gdb) p [dict objectForKey:@"MyKeyValue"] 
$22 = (struct objc_object *) 0x7fffd94fe690 
(gdb) p [key compare"@MyKeyValue"] 
$25 = NSOrderedSame 

는 '키'는 다른있는 NSDictionary에서 추출하여 초기화되는하고, (파일로드) 다른 사전의 항목 중 일부는 유니 코드 문자를 포함한다. 즉, 지금까지 유일한 상관 관계는 소스 파일에서 유니 코드를 제거하고 응용 프로그램을 다시 실행하면 작동한다는 것입니다.

이에 대한 문제가되지 않습니다 gnustep1.18 또는> = gnustep1.20

나는 비슷한 문제로 실행
2

. 나에게 문제는 그것이 실제로 NSNumber 일 때 내 키가 NSString이라고 생각했다는 것이었다. 다음을 사용하여 키를 확인할 수 있습니다

for (id key in [aDict allKeys]){ 
     NSLog(@"%@:%@",key, [[key class] description]); 
    } 
} 
+0

이 프로세스는 내 문제를 해결하는 데 도움이 .. –

0

나는 aDict가 NSDictionary의 인스턴스가 아닌 것으로 생각합니다. 로그를 남기고 확인하십시오.

관련 문제