2013-05-14 2 views
2
NSString *string = [NSNumber numberWithInt:2]; 
int var = [string intValue]; 

var는 2가됩니다. 그래서, 왜? 나는 다이나믹 타이핑에 관해서는 솔직함을 이해하고 있지만, 그 내용은 무엇입니까?NSString에 NSString 할당하기

+3

나는 어떤 주조도 보이지 않는다. 정확히 무엇을 요구하고 있습니까? –

+0

타입 캐스팅이 있습니다. 그러나 암시 적입니다. id에서 NSString *. 그러나 물론, 그는 뭔가 다른 것을 말하고 싶었습니다. –

+0

@ AminNegm-Awad는 동적 유형 지정입니다. – vikingosegundo

답변

2

이 코드 예에서는 캐스팅이 수행되지 않습니다. [string intValue]은 정수로 저장된 값을 검색하기 위해 NSNumber이 제공하는 일반 Objective C 방법입니다. NSString 포인터에 객체를 할당했다는 사실은 아무 것도 바뀌지 않습니다 : 내부의 객체는 NSNumber입니다. Objective C는 동적 유형의 언어이기 때문에 충돌이 발생하지 않습니다. 그것은 당신이 잘못된 유형의 객체를 할당 할 수 있습니다,하지만 당신은 당신의 string 객체에 NSString의 메소드를 호출하려고하면, 당신은 충돌을받을 예정 :

NSString *string = [NSNumber numberWithInt:2]; 
int var = [string intValue];    // OK 
BOOL isTwo = [string isEqualToString:@"2"]; // Crash 
+0

나는 그가 NSNumber 객체를 NSString * 변수에 할당했기 때문에 OP에 생각합니다. 거기에 문자열이 있다는 것입니다. –

+0

예, 주요 질문은 그 코드가 작동하는 이유입니다. NSNumber가 NSString에 할당 된 다음 intValue가 int에서 해당 문자열을 변환했습니다. – alex

+2

@alex NSNumber 객체는 포인터 변수에 할당되었습니다.이 포인터 변수는 NSString 포인터이지만 할당 된 객체는 여전히 NSNumber입니다. 변환이 수행되지 않습니다. 'intValue'를 호출하면, 그것은'NSNumber' 객체에서 호출됩니다. 어떠한 종류의 문자열도 관련되어 있지 않습니다. – rmaddy

2

[string intValue]에 대한 호출 정말 message expression이다. 이것은 string이 실제로 NSNumber 개체를 가리키고 있으며 intValue 메시지에 응답하기 때문에 작동합니다. rangeOfString과 같은 NSString 클래스에만 해당하는 메시지를 보내려고하면 "선택기를 인식하지 못함"오류가 발생합니다.

디버거에서이 코드를 실행하고 중단 점을 넣으면 런타임에서 string의 유형이 실제로 NSNumber임을 알게됩니다.

1

NSNumber이라는 참조를 저장 한 다음 나중에 다시 변환하는 문자 변환이 없습니다. 너는 NSString도 필요 없다. id

id this = [NSNumber numberWithInt:22]; 
    int val = [this intValue]; 
    NSLog(@"%d",val);