런타임에 클래스를 objective-c에서 정의 할 수 있습니까?
예. 나는 객체를 정의하고 그것을 생성하고 런타임에 사용하는 XML 파일을 받는다.Objective-c 클래스 런타임 정의
답변
, 나는 단지 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 –
@TimKemp 사실,이 질문을 보았을 때 저는이 글을 쓰고있었습니다 ...이 아이디어는 항상 저에게 흥미를 불러 일으켜 런타임에 클래스를 생성하고, 그리고 그것을 테스트하고 싶었습니다 ... 이것은 블럭으로도 가능합니다. 블럭을 사용하여 오브젝트를 생성하는 것은 실제로 정말 멋집니다. –
정말 멋지 네요. Objective C에서 런타임 바인딩 및 선택기 기반의 작업을 얼마나 멀리 할 수 있는지 궁금합니다. 그것은 내가 생각했던 것보다 더 나아 갔다. 바로크를 엿볼 수있게 해줘서 고마워요.이게 진짜로이게 전부입니다. 실용적이지는 않지만, 그 위태 로움에 어떤 아름다움이 있습니다.) –
예, 은입니다. 유형을 생성하고 메서드와 저장 공간을 정의하는 데 런타임을 사용합니다. 그러나이 작업은 매우 드문 일입니다. 사용
인터페이스는 런타임 헤더 objc/runtime.h
에, 그리고 당신이 원하는 호출 objc_allocateClassPair
, class_addMethod
이 class_addIvar
가 등 분명 작품의 꽤 순서 클래스와 레이아웃, 선택기를 만들 거기 수행 할 것입니다, 및 XML 설명에서. 따라서 가능하지만 무료는 아닙니다.
당신은 이것을 확장 할 필요가 있습니다 :) –
하지만 정말로, 당신은 안됩니다 ... –
@Tim Kemp lol - 저는 객관적으로 런타임에 클래스를 정의 할 수 있습니까? -하지만 지금 확장했습니다 =) – justin
예; 완전히 가능합니다. 자세한 내용은 Objective-C Runtime Programming Guide을 참조하십시오 (관련 가이드 & 문서 포함).
저스틴 (Justin)이 말했듯이이 경로는 매우 비 전형적인 방식입니다. XML 데이터를로드하는 경우 거의 항상 XML이 엄격한 DTD 또는 스키마 인 잘 정의 된 구조를 가져야한다는 캐스트이며 따라서 규율되고 잘 정의 된 데이터 모델로 훨씬 더 나아질 것입니다 핵심 데이터 또는 직접 구현을 통해 앱에 컴파일되어 XML을로드합니다. 이렇게하면보다 엄격한 검증이 가능 해지고 훨씬 쉬울 것입니다.
"자유형 데이터 소비"의 성배는 유혹적이지 않지만 그 길은 광기와 많은 비애감의 이야기입니다.
- 1. NumberFormatter - ObjectiveC
- 2. 런타임 클래스 경로에 주석 클래스 파일이 필요합니까?
- 3. ObjectiveC project organization
- 4. C# 런타임 클래스 생성
- 5. PHP 런타임 클래스 수정
- 6. 자바 런타임 클래스 리플렉션
- 7. Wicket - 런타임 클래스 다시로드
- 8. WAS의 런타임 클래스 경로
- 9. 런타임 환경 정의
- 10. 사용자 정의 클래스 로더를 사용하여 Java 런타임 및 API 클래스로드
- 11. 동적으로 정의 NSObject의 클래스
- 12. InterfaceBuilder에서 이미지 시퀀스로드 -ObjectiveC
- 13. ObjectiveC 임의 숫자
- 14. Shapefile with ObjectiveC
- 15. ObjectiveC blocks Java equivalent
- 16. MulticastDelegate in ObjectiveC
- 17. 런타임 오류 "클래스 조각 늘림"
- 18. 개미의 런타임 클래스 경로는 javac의
- 19. 사용자 정의 런타임 오류 메시지
- 20. 클래스 정의
- 21. 런타임
- 22. ObjectiveC/iPhone의 TwitPic API 사용하기
- 23. UIScrollView에 이미지 배열 추가 ObjectiveC
- 24. objectivec : fb 게시물 댓글 오류
- 25. iphone objectiveC 할당/해제 질문
- 26. Python의 AppKit 및 ObjectiveC 대리자
- 27. 2D 동적 메모리 할당 - ObjectiveC
- 28. 쿠키의 계층 정의 클래스 정의
- 29. ObjectiveC 코드에서 C++ 클래스의 정적 필드 사용
- 30. 런타임
XML에서 ivars 및 메서드를 사용하여 완전히 새로운 클래스 유형을 선언하거나, XML에서 제공하는 상태 (ivars, 속성 등)가있는 기존 클래스의 인스턴스를 만드는 것을 의미합니까? –
당신이 할 수 있다면 (그리고 아마 할 수있는), 진짜 질문은 ... –
Tim, 완전히 새로운 클래스 유형을 만드는 첫 번째 옵션. –