2010-02-09 20 views
18

¿Por qué NSClassFromString devuelve nil? Según la definición, tiene que devolver el nombre de clase. ¿Cómo debo solucionar este problema? Necesito crear una instancia de una cadena y llamar al método, que está en la clase, usando la instancia creada.NSClassFromString returns nil

Así es como mi código es el siguiente:

id myclass = [[NSClassFromString(@"Class_from_String") alloc] init]; 
[myclass method_from_class]; 

Pero la función method_from_class no está siendo llamada, el control no va en ella. Y mi código está libre de errores. ¿Alguna idea de cómo resolver esto en Objective-C?

+2

Mire http://stackoverflow.com/questions/1634644/create-a-class-at-runtime-why-do-nsclassfromstring-and-objcgetclass-return-nil –

+26

* Mi código está libre de errores *, esa es una buena :) –

+1

:) :) pero sin cumplir mi propósito :( – suse

Respuesta

29

The Documentation for the function says:

Valor devuelto El objeto de la clase nombrada por aClassName, o nil si no hay clase por ese nombre está cargado actualmente. Si aClassName es nulo, devuelve nil.

Un ejemplo de cómo esto se debe utilizar adecuadamente es el siguiente:

Class dictionaryClass = NSClassFromString(@"NSMutableDictionary"); 
id object = [[dictionaryClass alloc] init]; 
[object setObject:@"Foo" forKey:@"Bar"]; 
+0

Pero el valor en la cadena @ "Class_from_String" tiene el valor del nombre de la clase, porque lo he impreso justo arriba, antes de crear una instancia de la clase de la cadena. Luego ¿cómo es que está tomando como cero? – suse

+0

hey 1er he escrito 3ra línea como: *** [objeto TestMethod]; *** TestMethod es el método en la misma clase, pero aún el control no entra en la definición del método. – suse

+0

wat debería hacerlo. Por favor contácteme alguna alternativa. – suse

1

Por qué no descomponer todas estas llamadas? De esta manera, se puede comprobar los valores entre las llamadas:

Class myclass = NSClassFromString(@"Class_from_String"); 
id obj = [[myclass alloc] init]; 
[obj method_from_class]; 

Por cierto, es method_from_class un método de instancia o un método de clase? Si se trata de la tarde, entonces se puede llamar directamente method_from_class en el valor myclass:

[myclass method_from_class]; 
+0

"Por cierto, ¿method_from_class es un método de instancia o un método de clase?" Bueno, si no era un método de instancia, su código debería bloquearse. – newacct

+0

Buen lugar de hecho. –

36

Si está intentando crear una instancia de una clase de una biblioteca estática, debe agregar la opción "-ObjC" a la "Otra Configuración de construcción de los indicadores de los enlaces.

+0

¿Agregar esta bandera a la lib estática o al programa principal que usa la lib estática? – NeilJiang

+3

Funcionó para mí configurándolo en el programa principal. – micahp

+1

¡Eres increíble! ¡Salvó mi vida! :) Muchas gracias. – defactodeity

0

También vi una rareza en la que agregar el código singleton estándar adoptado por Apple impidió que se cargara la clase. El código funcionaba como se esperaba, luego agregué el singleton y, de repente, NSClassFromString comenzó a devolver nil. Al comentar el código singleton, NSClassFromString resolvió la clase correctamente. No entiendo la interacción, pero creo que la var estática singleton de alguna manera se rompió para ocultar el nombre de clase ...?

2

También debe asegurarse de que la clase que intenta crear una instancia esté incluida en el proyecto. Si lo agregó más tarde, hizo la necesidad de hacer clic en la casilla de verificación al lado del objetivo que está creando.

+0

Esta respuesta funcionó para mí. Agregué la nueva clase mientras se seleccionaba un objetivo diferente. Tuve que seleccionar: Target> Build Phases> Compile Sources> '+' para obtener la clase _really_ agregada al proyecto. –

4

Es posible que su clase no se enlace si esta es la única referencia a la misma.

Tenía un método de fábrica para crear instancias de varios tipos de subclase. La fábrica tenía una declaración de cambio que iba a la subclase apropiada y la asignaba e iniciaba. Noté que todas las instrucciones alloc/init eran exactamente iguales, excepto por el nombre de la clase. Así que pude eliminar todo el bloque de conmutadores utilizando la función NSClassFromString().

Me encontré con el mismo problema: la devolución fue nula. Esto se debía a que la clase no se usaba en ningún otro lugar del programa, por lo que no se vinculaba, por lo que no se pudo encontrar en el tiempo de ejecución.

Puede resolver esto incluyendo la siguiente declaración:

[MyClass class]; 

Eso en contra del propósito de lo que estaba tratando de lograr, pero podría ser todo lo que necesita.

4

Esto me sucedió cuando agregué un archivo externo al proyecto de Xcode. Agregar el archivo .m a Fases de compilación>Las fuentes de compilación resuelven el problema.

+0

Esto también me pasó cuando agregué el archivo .m pero olvidé escribir @implementation –