objective-c class instantiation

objective c - Cómo crear una instancia de una clase en Objective-C que no se hereda de NSObject



class instantiation (4)

Dado este:

Persona.h:

@interface Person { } - (void) sayHello; @end

Persona.m:

#import "Person.h" @implementation Person - (void)sayHello { printf("%s", "Steve"); } @end

¿Cómo crear una instancia de la persona? Intenté esto:

Person *p = [Person new];

Eso no funciona, ni esto:

Person *p = [Person alloc];

[ACTUALIZAR]

Olvidé decirle, ya traté de heredar de NSObject, el nuevo y los trabajos de asignación. ¿Tengo curiosidad si podemos crear una instancia de una clase que no hereda de NSObject?


Absolutamente puedes hacerlo. Su clase simplemente necesita implementarse +alloc sí misma, como NSObject hace NSObject . En la base, esto solo significa usar malloc() para capturar una porción de memoria lo suficientemente grande como para que se ajuste a la estructura que define una instancia de su clase.

La gestión de la memoria contada de referencia también sería buena ( retain / release ); Esto es en realidad parte del protocolo NSObject . Puedes adoptar el protocolo e implementar estos métodos también.

Para referencia, puede mirar la clase de Object , que es una clase de ObjC raíz como NSObject , que Apple proporciona en su repositorio de código abierto para el tiempo de ejecución de Objective-C:

@implementation Object // Snip... + alloc { return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); } // ... - init { return self; } // And so on...

Dicho esto, debe pensar en NSObject como una parte integral del tiempo de ejecución de ObjC. Hay pocas razones, si las hay, para implementar su propia clase raíz fuera de la curiosidad, la investigación o la experimentación (que, sin embargo, no debe desalentarse en absoluto).


Debes:

  1. Heredar de NSObject,
  2. Haz una clase de "hombres pobres" con tus propios mallocs, etc., o
  3. Usa Objective-C ++ y crea una clase de C ++.

Por supuesto, ninguno de los otros dos se ajusta a la gestión de almacenamiento de Objective-C, y sus protocolos de llamada, etc., son diferentes.


No hay (muy probablemente) una buena razón para no querer heredar de NSObject, pero hay muchas buenas razones para hacerlo.

Me gustaría saber por qué no desea heredar de NSObject. Yo diría que se debe a la falta de conocimiento en lugar de una necesidad real.

Pero incluso sin conocer esa razón: no lo hagas. Es tan difícil hacer esto bien de una manera que aún sea agradable con otras clases de Objective-C que sea prácticamente imposible.

De todos modos, estás creando una instancia de tus objetos de una manera que oculta lo que realmente se hace. Mientras que en Java, usualmente creas instancias a través del método constructor predeterminado new , en Objective-C alloc instancia llamando a alloc en la clase y luego init en la instancia:

Person *aPerson = [[Person alloc] init];

(Es posible simplemente usar Person new , pero no lo haría porque oculta lo que realmente has hecho de ti)

Implementas tu clase tal que heredas de NSObject y luego, si es necesario, escribes tu propio método init .

Si desea iniciar sesión en la consola, use NSLog :

NSLog(@"Hello %@", @"Steven");

( @"" es un constructor especial para una NSString. Las cadenas en Objective-C no son matrices de bytes, sino objetos.)


no puedes ..

Alloc y new ..copy init todos estos métodos se definen en NSObject ..

Tampoco puede crear el suyo propio, ya que Apple no proporciona la clase de implementación NSObject ... así que tiene que heredar de NSObject o su subclase para que pueda inicializar su clase