이름으로 클래스의 인스턴스를 만들 수 있습니까? 다음과 같은 것 :
NSString* className = @"Car";
id* p = [Magic createClassByName:className];
[p turnOnEngine];
Objective-c에서 이것이 가능한지 모르겠지만 그럴 것 같습니다.
답변
id object = [[NSClassFromString(@"NameofClass") alloc] init];
답변
NSClassFromString()
클래스 이름을 잘못 입력하거나 존재하지 않는 클래스를 사용할 위험이 있습니다. 그 오류가 발생하면 런타임까지 알 수 없습니다. 대신 기본 제공 Objective-c 유형 Class
을 사용하여 변수를 생성하면 컴파일러가 클래스가 존재하는지 확인합니다.
예를 들어, 귀하의 .h
:
@property Class NameOfClass;
그리고 당신의 .m
:
id object = [[NameOfClass alloc] init];
클래스 이름을 잘못 입력했거나 존재하지 않으면 컴파일 타임에 오류가 발생합니다. 또한 이것이 더 깨끗한 코드라고 생각합니다.
답변
당신이없이 오브젝티브 C로 작업하는 경우 NeXTstep
( OS X
, iOS
, GNUstep
등) 시스템 또는 그냥이 방법은 깨끗한 생각, 당신이 활용할 수있는 목표 – C 언어 런타임 라이브러리의 API를 . 아래 Objective-C 2.0
:
#import <objc/runtime.h>
//Declaration in the above named file
id objc_getClass(const char* name);
//Usage
id c = objc_getClass("Object");
[ [ c alloc ] free ];
Objective-C (1.0 또는 이름없는 버전)에서 다음을 활용합니다.
#import <objc/objc-api.h>
//Declaration within the above named file
Class objc_get_class( const char* name);
//Usage
Class cls = objc_get_class( "Test" );
id obj = class_create_instance( cls );
[ obj free ];
1.0
버전을 테스트하지는 않았지만 2.0
현재 프로덕션중인 코드 에서 함수를 사용했습니다 . 개인적으로 활용하는 생각 2.0
이 공간을 적게 소모로 기능하는 것은 NS 기능 이상 사용할 수 청소기 경우입니다 : the length of the name in bytes + 1 ( null terminator )
2.0 대 API의 the sum of two pointers (isa, cstring)
하는 size_t length (cstring_length)
, 그리고 length of the string in bytes + 1
을위한 NeXTSTEP
API.
답변
@interface Magic : NSObject
+ (id)createInstanceOfClass:(Class)classe;
@end
@implementation Magic
+ (id)createInstanceOfClass:(Class)classe
{
return [[classe alloc] init];
}
@end
그런 다음 사용하려면 :
Car *car = [Magic createInstanceOfClass:[Car class]];
[car engineTurnOn];