2010-08-01 5 views
0

다음은 컴파일되지만 실행하면 충돌합니다.NSLog에 NSString을 표시하는 방법

-(void) testFunc : (NSString *)s{ 
    NSLog(@"%@", s); 
} 

이 코드의 잘못된 점은 무엇입니까?

NSString *msg = @"This is a message"; 
[self performSelector:@selector(testFunc) withObject:msg afterDelay:0]; 
[msg release]; 
+3

충돌 로그가 무엇인가? – taskinoor

+0

크래시 로그에 인식 할 수없는 선택기가 전송되었다고 표시됩니다. –

+0

'msg'를 해제 할 필요는 없습니다. 사실, 그렇게해서는 안됩니다. – dreamlax

답변

5
[self performSelector:@selector(testFunc) withObject:msg afterDelay:0]; 

은 다음과 같아야합니다

[self performSelector:@selector(testFunc:) withObject:msg afterDelay:0]; 
+0

하나의 인수가 필요하기 때문에 그런가요? 두 개 걸리면 어떡하지? –

+1

예, 인수가 하나 인 경우 선택기에':'만 추가하면됩니다. 하나 이상인 경우 인수의 이름과 다른':'을 사용해야합니다. –

+1

즉, 셀렉터에는 메서드 당 하나의 인수가 있습니다. 인자를 취하지 않는 메소드는 셀렉터에서 콜론이없는 단일 세그먼트를가집니다. 하나의 인수를 취하는 메소드에는 콜론이 오는 단일 세그먼트가 있습니다. 여러 개의 인수를 취하는 메소드는 콜론 (:)이 뒤 따르는 많은 세그먼트를 가지고 있습니다. 따라서, 여러분의 질문에 사용 된 선택기는'testFunc'라는 이름의 메소드에 도달하게됩니다 (인자를 취하지 않음); 그런 메소드가 없으므로 코드는 대신 예외를 발생시킵니다. 가지고있는 메소드가 하나의 인수를 취하기 때문에, 그 셀렉터는'testFunc :'입니다. –

1

당신에게 sNSString에 대한 유효한 포인터 확실 :

는이 같은 함수를 호출?

+0

원본 메시지를 편집하여 s의 선언 방법을 보여줍니다. –

+0

awakeFromNib : 그건 icktoofay의 질문에 대답하지 않습니다. 변수를 올바르게 선언하는 것은 해당 변수에 넣은 포인터의 유효성과 아무런 관련이 없습니다. 올바르지 않게 선언 된 변수는 단순히 컴파일을 실패하지만 위조 포인터에서 객체에 메시지를 보내려고하면 해당 변수의 가짜 포인터로 인해 충돌이 발생합니다. –

+0

유효한 포인터인지 알 수 없으므로 필자가 쓴 글을 게시했습니다. –

관련 문제