Objective-C 클래스-> 문자열 : [NSArray className]-> @“NSArray”


128

클래스 객체 자체에서 클래스의 문자열 이름을 가져 오려고합니다.

// For instance
[NSArray className]; // @"NSArray"

나는 그것을 찾았 object_getClassName(id obj)지만 인스턴스가 전달되어야하며 내 경우에는 불필요한 작업입니다.

그렇다면 인스턴스가 아닌 클래스 객체에서 문자열을 어떻게 얻을 수 있습니까?

답변:


305
NSString *name = NSStringFromClass ([NSArray class]);

다른 방법으로 되돌아 갈 수도 있습니다.

Class arrayClass = NSClassFromString (name);
id anInstance = [[arrayClass alloc] init];

감사! 어떻게 NSStringFromClass구현됩니까? 클래스 이름을 static NSString변수 에 저장하는 것이 더 성능이 좋습니까?
ma11hew28

13
@MattDiPasquale : 모든 클래스 이름은 Objective-C 런타임 어딘가에 저장됩니다 (런타임 내부는 대부분 애플리케이션에서 숨겨져 있으며 일부 API 함수를 통해서만 노출됩니다). 각 클래스 객체 (예 :) [NSArray class]는 실제로입니다 struct. 이 struct클래스에는 클래스의 이름, 구현하는 메소드, 수퍼 클래스 등 클래스에 대한 많은 정보가 포함되어 있습니다. 클래스 NSStringFromClass이름을이 클래스에서 가져 와서 struct로 변환하면됩니다 NSString. 에 클래스 이름을 저장하지 마십시오 static NSString. 성능상의 이점이 없습니다.
dreamlax

3
@MattDiPasquale : NSClassFromString조금 다르게 작동합니다. 모든 클래스 이름은 Objective-C 런타임 어딘가에 존재 NSClassFromString하므로 문자열을 가져와 주어진 이름을 가진 클래스를 찾기 위해 런타임에 의해 유지 보수되는 클래스 목록을 탐색합니다. 그것을 찾으면 그것을 반환하고, 그렇지 않으면를 반환합니다 Nil.
dreamlax

2
@MattDiPasquale : "NSStringFromClass는 어떻게 구현됩니까?" 만약 당신이 정말로 알고 싶다면, 아마도 class_getName()C 문자열을 반환하는 런타임에서 사용 합니다
user102008

2
@AlexZavatone : classNameMac OS X에서만 사용할 수있는 스크립팅 확장 프로그램에 의해 추가 된 방법으로, 완전히 문서화되지 않았기 때문에 (또는 적어도 마지막으로 확인한 시간이 아니기 때문에) 작동 방식이 까다 롭습니다. NSStringFromClass()올바른 방법입니다.
dreamlax

1

타이핑을 약간 줄이면 다른 방법이 있습니다.

NSString *name = [NSArray description];

7
요청 된 것을 수행한다고 보장되지는 않습니다. 이 방법은 일반적으로 개체와 개체에 대한 설명을 제공하기 위해 재정의됩니다.
Alex Wayne

3
INSTANCE 메서드로 재정의되었지만 + description CLASS METHOD가 얼마나 자주 재정의되는지 알고 있습니다. 어쨌든 모든 수업에 대해 그렇지 않은지 고려해 볼 가치가 있습니다 ... 다운 그레이드가 필요하다고 생각하지 않습니다.
Sherwin Zadeh

1
@SherwinZadeh : 실제로는 재정의 된 클래스를 찾지 못할 것이라고 생각 +description하지만 이론 상으로는 이것이 목적 +description이 아니므 로이 방법은 클래스 이름을 결정하는 데 취약합니다.
dreamlax

1

이 대안을 고려하십시오.

const char *name = class_getName(cls);

NSString 객체를 할당하고 ASCII를 NSString표현으로 변환 할 필요가 없으므로 훨씬 빠릅니다 . 그것이 NSStringFromClass()구현되는 방법 입니다.


이것은 나에게 유용했지만 파일 맨 위에 #import <objc / runtime.h>를 추가해야했습니다.
Sparklellama 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.