Crea una classe in fase di esecuzione - Perché NSClassFromString AND objc_getclass restituiscono zero?

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

  •  06-07-2019
  •  | 
  •  

Domanda

Ho provato a usare entrambi:

NSClassFromString and objc_getclass 

per restituire una classe, così posso crearla in fase di esecuzione, ma entrambe le funzioni restituiscono zero per alcune classi, ad esempio "TestClass". Nota che NSClassFromString funziona per me per il 99% delle classi.

Se aggiungo

[TestClass class];

prima di chiamare NSStringFromClass o objc_getclass, funziona. e se provo a creare semplicemente la classe usando un riferimento di classe, cioè:

[TestClass alloc];

funziona anche. Quindi, come posso forzare il caricamento della classe in fase di esecuzione in modo che NSClassFromString o objc_getclass non restituiscano zero?

È stato utile?

Soluzione

Ho riscontrato questo stesso problema. Nel mio caso avevo un codice che cercava la classe usando

Class aClass = objc_getClass("Foo");

Funzionava quando la classe Foo era nello stesso pacchetto di progetti del mio delegato App.

Come parte del refactoring del codice, ho spostato la classe Foo e le classi modello associate dal progetto AppDelegate in un progetto lib statico comune che sarebbe stato più facile testare e riutilizzare.

Quando ho spostato la classe Foo in libFooBar, objc_getClass (" Foo ") ora restituiva zero invece della classe Foo.

Per risolvere questo problema, ho chiamato la classe che mi interessa in modo che le classi di libFooBar siano registrate con il runtime Objective-C. L'ho fatto così:

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

Ora objc_getClass (" Foo ") restituisce di nuovo la classe Foo invece di zero.

Posso solo supporre che le classi della libreria statica non siano registrate fino a quando non viene effettuata una chiamata a una delle classi nella libreria statica.

Altri suggerimenti

Il riferimento al runtime di Objective-C può aiutarti qui. Ad esempio, la documentazione per objc_getClass dice: " L'oggetto Class per la classe nominata, o nulla se la classe non è registrata con il runtime Objective-C. & Quot; Guardando in giro per la discussione sulla registrazione, trovi questo bocconcino in objc_getClassList:

  

" La libreria di runtime Objective-C registra automaticamente tutte le classi definite nel codice sorgente. Puoi creare definizioni di classe in fase di esecuzione e registrarle con la funzione objc_addClass. & Quot;

(E ovviamente i documenti non sono aggiornati perché objc_addClass è obsoleto, objc_allocateClassPair e objc_registerClassPair al suo posto.)

Sembra un mondo di dolore se non ti rendi facile questo con te stesso. Qualche possibilità che tu possa fare semplicemente riferimento alle tue classi dinamiche nel codice all'avvio dell'app?

Ho dovuto aggiungere manualmente la classe (ad esempio TestClass.m) alle impostazioni di compilazione. Costruisci fasi > Compila fonti > + > TestClass.m

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top