2009-10-28 3 views
2

내가 모두 사용하여 시도했다 :런타임에 클래스 만들기 - NSClassFromString과 objc_getclass가 nil을 반환하는 이유는 무엇입니까?

NSClassFromString and objc_getclass 

클래스를 반환하는, 그래서 런타임에 그것을 만들 수 있지만 두 기능은 "TestClass에"예를 들어, 어떤 클래스 전무를 반환합니다. NSClassFromString 클래스는 99 %의 클래스에서 작동합니다. 내가 NSStringFromClass 또는 objc_getclass를 호출하기 전에 내가

[TestClass class]; 

를 추가하는 경우

, 그것을 작동합니다. 클래스 참조를 사용하여 클래스를 만들려고 시도하면 (예 :

[TestClass alloc]; 

). 그래서 NSClassFromString 또는 objc_getclass가 nil을 리턴하지 않도록 어떻게 클래스를 실행시에 강제로로드 할 수 있습니까?

답변

6

동일한 문제가 발생했습니다. 내 경우에는 내가 푸 클래스 내 AppDelegate에 같은 프로젝트 번들에있을 때 일

Class aClass = objc_getClass("Foo"); 

를 사용하여 클래스를 찾고 있던 코드를했다.

코드 리팩토링의 일환으로 Foo 클래스와 관련 모델 클래스를 AppDelegate 프로젝트 밖으로 옮겨 테스트하고 재사용하기 쉬운 공통 정적 lib 프로젝트로 옮겼습니다.

Foo 클래스를 libFooBar로 이동하면 objc_getClass ("Foo")가 이제 Foo 클래스 대신 nil을 반환합니다.

이 문제를 해결하기 위해 libFooBar의 클래스가 Objective-C 런타임에 등록되도록 관심있는 클래스를 호출했습니다. 나는 이것을 이렇게했다 :

Foo* foo = [[Foo alloc] init]; 
[foo release]; 
Class aClass = objc_getClass("Foo"); 

이제 objc_getClass ("Foo")는 nil 대신 Foo 클래스를 다시 반환한다.

정적 라이브러리의 클래스 중 하나에 대한 호출이 이루어지기 전까지 정적 라이브러리 클래스가 등록되지 않는다고 가정 할 수 있습니다.

3

Objective-C 런타임 참조가 여기서 도움을 줄 수 있습니다. 예를 들어, objc_getClass에 대한 문서는 "명명 된 클래스의 Class 객체이거나 Objective-C 런타임에 클래스가 등록되어 있지 않으면 nil"이라고 말합니다. 등록의 토론 주위에 보면 당신은 objc_getClassList이 맛있는 가벼운 음식을 찾을 :

는 "목표 - C 런타임 라이브러리가 자동으로 소스 코드에 정의 된 모든 클래스를 등록 런타임에 클래스 정의를 작성하고 objc_addClass로 등록 할 수 있습니다. 기능."

(그리고 objc_addClass가 그 자리에, objc_allocateClassPair 및 objc_registerClassPair. 사용되지 않기 때문에 문서의 유효 기간이 있습니다 물론)

당신은 자신에 대한이 쉽게하지 않는 경우이 상처의 세계처럼 보인다 . 응용 프로그램이 시작될 때 코드에서 동적 클래스를 참조 할 수있는 기회가 있습니까?

+0

그게 내가해야 할 수도 있습니다 .... 이상하게 보입니다! –

3

수동으로 클래스 (예 : TestClass.m)를 빌드 설정에 추가해야했습니다. 빌드 단계> 소스 컴파일> +> TestClass.m

관련 문제