2013-04-02 1 views
2

그래서 클래스가 MyClass입니다. 그것의 이름은 char * myclasses[]의 일부입니다. objc 런타임 API를 사용하여 할당하고 싶습니다.
1) 이것을 수행하는 가장 좋은 방법입니까? 내 목표는 실제로 사용할 필요가있을 때까지 10 또는 15 개의 ViewController를 할당하지 않는 것입니다. 또한이를 작성하기 위해 거대한 switch 문을 사용하지 않아야합니다.Objective-C 클래스를 등록하는 중 런타임 참조

Class aClass = NSClassFromString ([NSString stringWithUTF8String:myclasses[1]]); 
id myClass = class_createInstance(aClass, 0); 

나는 또한 클래스를 등록 이해하려고 노력 중이 야 ..

2) 런타임에 새로운 클래스 (단지) 할당을 만드는 아니에요 때문에, 나는 그것을 등록 할 필요가 없습니다, 옳은?
3) 클래스 등록은 일반적으로 어떻게 작동합니까? (어딘가에 문서로 나를 가리 키도록).

+0

이 더 나는 돈을 읽기 당신이 성취하려는 것을 이해하지 못합니다. '[[ alloc] init]'을 호출 할 때까지 객체 인스턴스를 할당 할 필요가 없습니다. 클래스의 인스턴스를 할당해야 할 때까지 클래스를로드하고 싶지 않다는 것을 의미하는 경우 - 까다로울 수 있습니다. 어쨌든 코드에서 심볼릭 링크를 상징적으로 참조하는 것을 피할 필요가 있습니다. 그러면 iOS에서 앱의 모든 클래스를로드하지 않아도된다고 생각하지 않습니다. (iOS는 동적 코드 로딩을 ​​허용하지 않습니다.) – nielsbot

+0

@nielsbot 새로운 컨트롤러가 컨트롤러 클래스 이름에 의해 C 문자열로 추가되는 단일 장소를 디자인하고, 사용 가능한 컨트롤러를 알 수 있습니다 (배열). 그런 다음 나중에 그 중 하나의 인스턴스를 만들 수 있습니다 (아래에서 해결되었습니다). – estobbart

+1

그런 경우에는 앱의 plist에서 클래스 이름 목록을 유지하는 것과 같은 작업을 할 수도 있습니다 ... 그냥 생각합니다 – nielsbot

답변

6

1) class_createInstance는 + alloc과 의미가 다릅니다. 난 그냥 (물론 평소대로 다음 -init*)

[aClass alloc] 

호출 추천 할 것입니다. 정상적인 할당을 위해 ObjC 런타임 함수를 사용할 필요가 없습니다.

2) 오른쪽,

3) 동적 클래스 작성을 등록 할 필요가 까다로운 비즈니스 없지만, 기본적으로 당신은 그것을 인스턴스 변수와 메소드를 추가 한 후, objc_allocateClassPair와 클래스 (NOT 해당 클래스의 인스턴스)를 할당 class_addMethodclass_addIvar으로 변경 한 다음 objc_registerClassPair을 호출하십시오. 그 후에는 정상적으로 사용할 수 있습니다. 당신은 C 문자열로 클래스 이름이있는 경우

+0

감사합니다. 아직도 내가 등록 부분을 이해하는지 잘 모르겠다. 그것은 무엇을 성취합니까? 일반 수업은 어떻게 등록됩니까? – estobbart

+0

프로그램이로드 될 때 런타임에 의해 등록됩니다. – nielsbot

+0

클래스를 클래스 목록에 추가합니다. 일반 클래스는 응용 프로그램에 컴파일 된 클래스 목록에서 런타임 자체에 의해 등록됩니다. –

1

, 당신은 같은 것을 수행 할 수 있습니다

const char * classNames[] = { 
    "NSObject" 
} ; 

[ [ objc_getClass(classNames[0]) alloc ] init ] ; 

을하지만 당신은 단지 대신 NSStrings의 목록을 유지할 수 :

NSString * classNames[] = { 
    @"NSObject" 
} ; 

[ [ NSClassFromString(classNames[0]) alloc ] init ] ; 
관련 문제