런타임에 클래스 생성 - NSClassfromspromspring 및 OBJC_GetClass가 NIL을 반환하는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1634644

  •  06-07-2019
  •  | 
  •  

문제

둘 다 사용해 보았습니다.

NSClassFromString and objc_getclass 

클래스를 반환하려면 런타임에 클래스를 만들 수 있지만 일부 클래스의 경우 두 기능 모두 "TestClass"에 대해 반환합니다. NSCLASSFROMSTRING은 99%의 클래스에서 저에게 효과가 있습니다.

내가 추가하면

[TestClass class];

nsstringfromclass 또는 objc_getClass를 호출하기 전에 작동합니다. 그리고 클래스 참조를 사용하여 수업을 만들려고한다면, 즉 :

[TestClass alloc];

그것은 또한 작동합니다. 그렇다면 NSClassfromString 또는 OBJC_GetClass가 NIL을 반환하지 않도록 런타임에 클래스를로드하도록하려면 어떻게해야합니까?

도움이 되었습니까?

해결책

나는이 같은 문제에 부딪쳤다. 제 경우에는

Class aClass = objc_getClass("Foo");

FOO 클래스가 내 AppDelegate와 동일한 프로젝트 번들에있을 때 효과가있었습니다.

코드 리팩토링의 일환으로 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 클래스를 다시 반환합니다.

정적 라이브러리의 클래스 중 하나에 전화를 걸 때까지 정적 라이브러리 클래스가 등록되지 않는다고 가정 할 수 있습니다.

다른 팁

Objective-C 런타임 참조가 여기에서 도움이 될 수 있습니다. 예를 들어, OBJC_GetClass에 대한 문서는 "명명 된 클래스의 클래스 객체 또는 클래스가 Objective-C 런타임에 등록되지 않은 경우 NIL"이라고 말합니다. 등록에 대한 토론을 둘러 보면 OBJC_GetClassList 에서이 Tidbit을 찾을 수 있습니다.

"Objective-C 런타임 라이브러리는 소스 코드에 정의 된 모든 클래스를 자동으로 등록합니다. 런타임에 클래스 정의를 만들어 OBJC_ADDCLASS 기능에 등록 할 수 있습니다."

(물론 OBJC_ADDCLASS가 더 이상 사용되지 않기 때문에 문서가 오래되었습니다.

당신이 자신을 쉽게 만들지 않으면 이것은 상처의 세계처럼 보입니다. 앱이 시작될 때 코드에서 동적 클래스를 참조 할 수 있습니까?

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top