Crie uma classe em tempo de execução - Por que NSClassFromString e retornar objc_getclass nulo?

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Eu tentei usar ambos:

NSClassFromString and objc_getclass 

para retornar uma classe, para que eu possa criá-lo em tempo de execução, mas ambas as funções retornar nulo para algumas classes, por exemplo "TestClass". Note-se que NSClassFromString funciona para mim por 99% das aulas.

Se eu adicionar

[TestClass class];

antes que eu chame NSStringFromClass ou objc_getclass-lo, ele funciona. e se eu tento apenas criar a classe usando uma referência de classe, ou seja:.

[TestClass alloc];

funciona também. Então, como posso forçar a classe de carga em tempo de execução de modo NSClassFromString ou objc_getclass não retornará nil?

Foi útil?

Solução

Corri para este mesmo problema. No meu caso eu tinha código que estava olhando para a classe usando

Class aClass = objc_getClass("Foo");

O que funcionou quando a classe Foo estava no mesmo pacote projeto como o meu AppDelegate.

Como parte da refatoração do código, me mudei a classe Foo e classes de modelo associados fora do projeto AppDelegate em um projeto lib comum estática que seria mais fácil de teste e reutilização.

Quando me mudei a classe Foo em libFooBar o objc_getClass ( "Foo") já retornou nil em vez da classe Foo.

Para resolver isso, eu coloquei na chamada para a classe Estou interessado na para que as classes de libFooBar são registrados com o tempo de execução Objective-C. Eu fiz isso assim:

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

Agora, o objc_getClass ( "Foo") retorna a classe Foo novamente em vez de zero.

Só posso supor que as classes de biblioteca estática não são registrados até que uma chamada a uma das classes na biblioteca estática é feito.

Outras dicas

O Objective-C Runtime referência pode ajudá-lo aqui. Por exemplo, a documentação para objc_getClass diz, "o objeto de classe para a classe chamada, ou nulo se a classe não está registrado com o tempo de execução Objective-C." Olhando em volta para a discussão de registro que você encontrar este petisco em objc_getClassList:

"A biblioteca de tempo de execução Objective-C registra automaticamente todas as classes definidas no seu código-fonte. Você pode criar definições de classe em tempo de execução e registrá-los com a função objc_addClass."

(E, claro, os documentos estão desatualizados porque objc_addClass está obsoleta, objc_allocateClassPair e objc_registerClassPair em seu lugar.)

Isto parece um mundo de dor, se você não fizer isso mais fácil. Qualquer chance que você pode apenas referenciar suas aulas dinâmicas em código quando o aplicativo é iniciado?

Eu tive que adicionar manualmente a classe (por exemplo TestClass.m) para as configurações de compilação. Fases de construção> compilação de fontes> +> TestClass.m

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top