2010-03-26 3 views
2

죄송합니다. 질문이 정확하지 않으면 Objective-C가 매우 새롭습니다.
이 코드는 경고를 던져 왜 이해 : 는 NSObject의 아니라 기본 타입이어야합니다가변 인수를 사용하는 메서드에서 캐스팅 경고

NSDictionary *dictNames = 
[[NSDictionary alloc] initWithObjectsAndKeys: 
    3, @"", 
    4, @"", 
    5, @"",nil]; 

키와 NSDictionary와의 값 "경고 : 'initWithObjectsAndKeys'의 인수 1을 통과하지 않고 정수에서 포인터를 만든다" , 정수 3, 4 및 5와 같습니다. (필요한 경우 수정하십시오.)
그러나이 경고가 첫 번째 키의 유일한 "올바른 입력"으로 왜 사라지는 지 이해할 수 없습니다.

NSDictionary *dictNames = 
    [[NSDictionary alloc] initWithObjectsAndKeys: 
    [NSNumber numberWithInteger:3], @"", 
    4, @"", 
    5, @"",nil]; 

NSDictionary와 다른 키의 유형을 가정하기 때문에 그것은인가? 이 초기화 방법이 맞습니까?

답변

7

당신이 언급 한 방법의 프로토 타입은

-(id)initWithObjectsAndKeys:(id)firstObject, ...; 

는 따라서 첫 번째 매개 변수는 ObjC 개체이어야합니다. 그러나 나머지는 varargs에 의해 전달됩니다. C에서 어떤 프리미티브라도 vararg 인수로 전달할 수 있습니다 (printf으로 생각하십시오). 따라서 컴파일러는 경고를 발행하지 않습니다.

컴파일러는 vararg 인수의 유형을 구분할 수 없지만 메서드에 id을 전달하는 것이 유효 함을 의미하지는 않습니다.

+0

사실 나는 키로 객체를 가져와야 할 때 objectForKey : (id) aKey를 사용하여 객체를 만든 다음 객체와 키 (id)가 있어야합니다. 답변 주셔서 감사합니다 :-) – rubdottocom

+0

첫 번째 인수가 Obj C 객체가되기위한 어려운 요구 사항입니까? 그렇지 않다면 선언의 구문은 무엇이되어야합니까? –

+0

@Saptarshi : 아니요, 예. '- (int) foo : (int) firstInt, ...' – kennytm