2009-12-02 16 views
5

La documentación dice:¿Cómo crear un objeto raíz en Objective-C sin NSObject?

Aunque no es estrictamente una parte del lenguaje , el puntero del ISA se requiere para un objeto de trabajar con el sistema de ejecución Objective-C. Un objeto debe ser "equivalente" a una estructura objc_object (definido en objc/objc.h) en los campos que define la estructura . Sin embargo, rara vez, si alguna vez, necesita crear su propio objeto raíz, y los objetos que heredan de NSObject o NSProxy tienen automáticamente la variable isa .

Si bien suena bien, me pregunto cómo se crearía un objeto raíz en Objective-C de todos modos?

Esto es para fines de aprendizaje. Solo quiero saber esto. Realmente me gustaría verlo.

Respuesta

7

En realidad, es una "trampa" que algunas personas migran de C# o de los lenguajes de estilo Java. Simplemente no se especifica una superclase al declarar su clase es decir

@interface MyNewRoot { 
Class isa; 
} 
@end 

vs

@interface MyObject : NSObject { 
} 
@end 

En Java o C# esto sería equivalente (en el primer caso el compilador asume System.Object o java .lang.Object era la superclase), pero en Objective-C no se asumirá dicho valor predeterminado y, por lo tanto, se crea una nueva raíz.

Sin embargo, ahora es responsable de una serie de características para su clase que normalmente da por hecho (incluso cosas simples como la gestión de memoria para asignar o desechar nuevas instancias, etc.). Esto es lo que el comentario que citó hace alusión cuando habla sobre struct objc_object y la variable de instancia isa, etc.

+0

Agregó el puntero isa a su definición de MyNewRoot. No puede tener un objeto sin ivars, debe tener al menos el puntero a la clase. – NSResponder

+0

Para evitar la falsa alarma _ "Class 'MyNewRoot' definida sin especificar una clase base" _ clang warnings, puede considerar envolver la interfaz con '#pragma clang diagnostic push' y' #pragma clang diagnostic ignored "-Wobjc -root-class "' before y '#pragma clang diagnostic pop' después. –