2011-12-19 4 views
4

런타임에 클래스를 objective-c에서 정의 할 수 있습니까?
예. 나는 객체를 정의하고 그것을 생성하고 런타임에 사용하는 XML 파일을 받는다.Objective-c 클래스 런타임 정의

+0

XML에서 ivars 및 메서드를 사용하여 완전히 새로운 클래스 유형을 선언하거나, XML에서 제공하는 상태 (ivars, 속성 등)가있는 기존 클래스의 인스턴스를 만드는 것을 의미합니까? –

+0

당신이 할 수 있다면 (그리고 아마 할 수있는), 진짜 질문은 ... –

+0

Tim, 완전히 새로운 클래스 유형을 만드는 첫 번째 옵션. –

답변

6
예, 밖으로 니펫을이 코드를 확인

, 나는 단지 C 방법을 사용하여 여기에 클래스, 그리고 (제작 메시지가 호출 단순화를위한) 하나의 프로토콜 정의를 ... 생성

MyCObject.h

#import <Foundation/Foundation.h> 

@protocol MyCObj_methods<NSObject> 

-(NSString *) getString; 
-(int) getInt; 
+(NSString *) someStaticMethod; 

@end 

typedef id<MyCObj_methods> MyCObj; 
extern Class MyCObj_class; 

__attribute__((constructor)) 
void MyCObj_initialize(); 

MyCObj MyCObj_alloc(  id self,  SEL _cmd); 
MyCObj MyCObj_new(   id self,  SEL _cmd); 

NSString *MyCObj_someStaticMethod (id self, SEL _cmd); 

MyCObj MyCObj_init(  MyCObj self, SEL _cmd); 
NSString *MyCObj_getString(MyCObj self, SEL _cmd); 
int MyCObj_getInt(   MyCObj self, SEL _cmd); 

MyCObject.m

#import "MyCObject.h" 
#import <objc/Object.h> 
#import <objc/runtime.h> 

static Class myStaticClass; 
Class MyCObj_class; 

typedef struct 
{ 
    Class isa; 
    NSString *myString; 
    int myInt; 
} MyCObj_t; 

void MyCObj_initialize(void); 

__attribute__((constructor)) 
void MyCObj_initialize() 
{ 
    MyCObj_class = objc_allocateClassPair([NSObject class], "MyCObj", 0); 
    objc_registerClassPair(MyCObj_class); 

    myStaticClass = object_getClass(MyCObj_class); 

    class_addMethod(MyCObj_class, @selector(init),  (IMP)MyCObj_init,  "@@:"); 
    class_addMethod(MyCObj_class, @selector(getString), (IMP)MyCObj_getString, "@@:"); 
    class_addMethod(MyCObj_class, @selector(getInt), (IMP)MyCObj_getInt,  "[email protected]:"); 

    class_addMethod(myStaticClass, @selector(alloc),   (IMP)MyCObj_alloc, "@@:"); 
    class_addMethod(myStaticClass, @selector(new),    (IMP)MyCObj_new, "@@:"); 
    class_addMethod(myStaticClass, @selector(someStaticMethod), (IMP)MyCObj_someStaticMethod, "@@:"); 
} 

MyCObj MyCObj_alloc(id self, SEL _cmd) 
{ 
    return (MyCObj) class_createInstance(MyCObj_class, sizeof(MyCObj_t) - sizeof(Class)); 
} 

MyCObj MyCObj_new(id self, SEL _cmd) 
{ 
    return (MyCObj) [[MyCObj_class alloc] init]; 
} 

NSString *MyCObj_someStaticMethod(id self, SEL _cmd) 
{ 
    return @"Some Static Method"; 
} 

MyCObj MyCObj_init(MyCObj self, SEL _cmd) 
{ 
    struct objc_super super = { .receiver = self, .super_class = [NSObject class] }; 

    if ((self = (MyCObj) objc_msgSendSuper(&super, _cmd))) 
    { 
     ((MyCObj_t *) self)->myString = @"hello world!"; 
     ((MyCObj_t *) self)->myInt = 15; 
    } 

    return self; 
} 

NSString *MyCObj_getString(MyCObj self, SEL _cmd) 
{ 
    return ((MyCObj_t *) self)->myString; 
} 

int MyCObj_getInt(MyCObj self, SEL _cmd) 
{ 
    return ((MyCObj_t *) self)->myInt; 
} 

사용법 :

MyCObj obj = [MyCObj_class new]; 
NSLog(@"%@ %i %@", [obj getString], [obj getInt], [MyCObj_class someStaticMethod]); 
+1

그만하세요. 당신은 아이들을 두려워하고 있습니다. (내 말 뜻대로) +1 –

+0

@TimKemp 사실,이 질문을 보았을 때 저는이 글을 쓰고있었습니다 ...이 아이디어는 항상 저에게 흥미를 불러 일으켜 런타임에 클래스를 생성하고, 그리고 그것을 테스트하고 싶었습니다 ... 이것은 블럭으로도 가능합니다. 블럭을 사용하여 오브젝트를 생성하는 것은 실제로 정말 멋집니다. –

+1

정말 멋지 네요. Objective C에서 런타임 바인딩 및 선택기 기반의 작업을 얼마나 멀리 할 수 ​​있는지 궁금합니다. 그것은 내가 생각했던 것보다 더 나아 갔다. 바로크를 엿볼 수있게 해줘서 고마워요.이게 진짜로이게 전부입니다. 실용적이지는 않지만, 그 위태 로움에 어떤 아름다움이 있습니다.) –

2

예, 입니다. 유형을 생성하고 메서드와 저장 공간을 정의하는 데 런타임을 사용합니다. 그러나이 작업은 매우 드문 일입니다. 사용

인터페이스는 런타임 헤더 objc/runtime.h에, 그리고 당신이 원하는 호출 objc_allocateClassPair, class_addMethodclass_addIvar가 등 분명 작품의 꽤 순서 클래스와 레이아웃, 선택기를 만들 거기 수행 할 것입니다, 및 XML 설명에서. 따라서 가능하지만 무료는 아닙니다.

+2

당신은 이것을 확장 할 필요가 있습니다 :) –

+0

하지만 정말로, 당신은 안됩니다 ... –

+0

@Tim Kemp lol - 저는 객관적으로 런타임에 클래스를 정의 할 수 있습니까? -하지만 지금 확장했습니다 =) – justin

5

예; 완전히 가능합니다. 자세한 내용은 Objective-C Runtime Programming Guide을 참조하십시오 (관련 가이드 & 문서 포함).

저스틴 (Justin)이 말했듯이이 경로는 매우 비 전형적인 방식입니다. XML 데이터를로드하는 경우 거의 항상 XML이 엄격한 DTD 또는 스키마 인 잘 정의 된 구조를 가져야한다는 캐스트이며 따라서 규율되고 잘 정의 된 데이터 모델로 훨씬 더 나아질 것입니다 핵심 데이터 또는 직접 구현을 통해 앱에 컴파일되어 XML을로드합니다. 이렇게하면보다 엄격한 검증이 가능 해지고 훨씬 쉬울 것입니다.

"자유형 데이터 소비"의 성배는 유혹적이지 않지만 그 길은 광기와 많은 비애감의 이야기입니다.