Erstellen Sie eine Klasse zur Laufzeit - Warum NSClassFromString UND objc_getclass Rückkehr null?

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich habe versucht, mit beiden:

NSClassFromString and objc_getclass 

eine Klasse zurück, so kann ich es zur Laufzeit erstellen, aber beide Funktionen liefern Null für einige Klassen, zum Beispiel „Testclass“. Beachten Sie, dass NSClassFromString funktioniert für mich für 99% der Klassen.

Wenn ich hinzufügen

[TestClass class];

, bevor ich NSStringFromClass oder objc_getclass es nennen, es funktioniert. und wenn ich versuche, nur die Klasse erstellen Sie eine Klasse Referenz verwendet, das heißt:.

[TestClass alloc];

es funktioniert auch. Also, wie kann ich die Klasse zwingen, zur Laufzeit zu laden, so NSClassFromString oder objc_getclass nicht Null zurückkehren?

War es hilfreich?

Lösung

Ich lief in das gleiche Problem. In meinem Fall hatte ich Code, der die Klasse wurde unter Verwendung der oben schaut

Class aClass = objc_getClass("Foo");

Welche gearbeitet, wenn die Foo-Klasse im selben Projekt Bündel wie mein AppDelegate war.

Im Rahmen den Code von Refactoring, zog ich die Foo-Klasse und die zugehörigen Modellklassen aus dem AppDelegate Projekt in ein gemeinsames statisches lib Projekt, das wäre einfacher zu testen und wieder verwenden.

Wenn ich die Foo-Klasse in libFooBar die objc_getClass ( "Foo") bewegt sich jetzt gleich Null anstelle der Foo-Klasse zurückgegeben.

Um dies zu lösen, habe ich in Aufruf der Klasse I in so interessiert bin, dass die Klassen von libFooBar mit der Objective-C-Laufzeit registriert sind. Ich tat dies wie folgt:

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

Nun ist die objc_getClass ( "Foo") gibt die Foo-Klasse wieder anstelle von Null.

Ich kann nur annehmen, dass die statische Bibliothek Klassen registriert sind erst ein Anruf zu einem der Klassen in der statischen Bibliothek gemacht wird.

Andere Tipps

Die Objective-C-Laufzeitreferenz kann Ihnen dabei helfen. Zum Beispiel sagt die Dokumentation für objc_getClass, „das Klassenobjekt für die benannte Klasse oder null, wenn die Klasse nicht mit der Objective-C-Laufzeit registriert ist.“ Umsah zur Diskussion der Registrierung Sie diese tidbit in objc_getClassList finden:

  

„Die Objective-C-Laufzeitbibliothek registriert automatisch alle Klassen definiert in Ihrem Quellcode. Sie Klassendefinitionen zur Laufzeit erstellen und registrieren sie mit der objc_addClass Funktion.“

(Und natürlich die docs sind veraltet, weil objc_addClass ist veraltet, objc_allocateClassPair und objc_registerClassPair an seinem Platz.)

Das sieht aus wie eine Welt der Schmerz, wenn Sie nicht auf sich selbst machen dies einfach. Jede Chance, Sie können einfach Ihre dynamischen Klassen in Code verweisen, wenn die Anwendung startet?

Ich musste manuell die Klasse (z TestClass.m) zu den Build-Einstellungen hinzuzufügen. Bauen Phasen> Compile Sources> +> TestClass.m

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top