2011-11-06 1 views
0

클래스에 대한 성찰을 수행 할 때, 나는 다음과 같은 코드를 사용합니다목표 C 반성

if([object isKindOfClass:[NSNumber class]]){ 

     NSLog(@"I am an NSNumber: %@", object); 
    } 

NSLog(@"Properties:%@", [object class]); 

출력은 다음과 같습니다 결과는 타입의 NSNumber에 대한 __NSCFNumber 이유

I am an NSNumber: 320 
Properties:__NSCFNumber 

누구든지 설명 할 수 있습니까? 나는 또한 NSArray를가로 식별됩니다주의 :

[email protected]"Class name: %@.", NSStringFromClass([object class]); 

그리고 당신이 얻을 것이다 : 내가 직접 귀하의 질문에 대답 할 수

__NSArrayI 

답변

6

NSNumberclass cluster.입니다. NSNumber는 여러 가지 구체적인 하위 클래스의 추상 공용 공개 클래스입니다. +numberWith... 메소드 중 하나를 사용하여 NSNumber을 만들면 이러한 하위 클래스 중 하나의 인스턴스가 생성됩니다.

"% @"저장 식별자에 해당하는 매개 변수로 NSLog() 객체를 전달할 때 NSLog()은 해당 객체에 -description 메시지를 보내고 해당 메시지 표현식에서 반환 된 객체를 해당 객체에 쓰는 문자열에 삽입합니다. stderr 파일 설명자.

+1

또한 '__NSCFNumber'는 NSNumber와 CFNumber 사이의 수신자 부담 브리징에서 파생 된 것이라고 생각합니다. 비슷한 결과가'[@ ""class]'('__NSCFString')에서 발생합니다. –

+1

Objective-C 환경 (NS)과 Core Foundation 환경 (CF)에는 본질적으로 동일한 클래스가 존재하기 때문에 재미있는 NSCFNumber 클래스 이름을 설명하는 "무료 브리지"가 있으며이 둘은 서로 교환하여 사용할 수 있습니다 . –

+0

감사합니다. 나는 자바와 C# 배경에서 왔는데, "인터페이스에 프로그래밍하는"것과 같다. (정확하게 이해한다면) – PhillyNJ

0

, 내가 당신을 말할 수있는 것은 당신이 할 수 있다는 것입니다

Class name: NSNumber. 

도움이 될만한가?

4

__NSCFNumber개인 서브 클래스NSNumber입니다. 내부적으로 사용되는 클래스가 무엇인지 걱정할 필요는 없습니다. OS가 성능을 향상시키는 데 사용하는 구현 세부 사항입니다.

NSStringNSArray을 포함하여이 패턴을 사용하는 클래스가 많이 있습니다 (Class Cluster이라고합니다).

유형/구현이 자주 변경 될 수 있으므로 실제 유형을 너무 많이 사용하는 것은 권장되지 않습니다. 그냥 NSNumber으로 치료하면 잘 될 것입니다!