¿Qué hace realmente Objective-C cuando declaras un object?

He leído la guía de administración de memory de Apple y no ve dónde se explica este caso …

Muchas veces, especialmente cuando escribo un método de class para devolver una instancia de una class, comenzaré así, porque así es como lo he visto y funciona.

[NOTA] Este código es de memory: lo actualizaré cuando llegue a casa para mostrar un ejemplo que realmente funciona (hice esto para ilustrarlo, pero obviamente no lo recuerdo lo suficiente como para build algo que tenga sentido …

[EDIT] Aquí está mi método actual: por supuesto, todos alloc razón al alloc que debo llamar a alloc que yo soy.

 + (id)player { Player *player = nil; if ((player = [[[super alloc] initWithFile:@"rocket.png"] autorelease])) { [player setProjectileType:kProjectileBullet]; [player setProjectileLevel:1]; [player setInvincible:YES]; [player setEmitter:[CCParticleSystemQuad particleWithFile:@"exhaust.plist"]]; [[player emitter] setPosition:ccp(0.0, player.contentSize.height/2)]; [player addChild:player.emitter]; } return player; } 

Entonces, lo que obtuve de las respuestas es: * Declarar la instancia solo me lleva un puntero a una location de memory y le dice a Xcode qué class será el object. * Configurar el puntero a cero prácticamente lo pone a cero – evitando que tenga basura en él (¿verdad?) * Dado que estoy autorizando la instancia, el object que se devuelve también se autorealiza.

Gracias por ayudarme a entender esto!

¿Alguien puede explicar lo que hace el comstackdor cuando ve esto?

  DooDad* aDooDad = nil; 

Si realmente está interesado en lo que hace el comstackdor, la respuesta es: el comstackdor reservará algo de memory en la stack para la variable local aDooDad , que es un tipo de puntero (generalmente tiene un tamaño de 64 o 32 bits según el procesador) . Ese puntero se inicializa para contener nil (generalmente 0x00..00 ).

Una statement como esta:

  DooDad* aDooDad = [[DooDad alloc] init...]; 

hace uso de la variable puntero aDooDad para almacenar la dirección en memory del object que está asignado (que es la dirección de la memory reservada por alloc ).

Entonces, al final,

  DooDad* aDooDad = nil; 

no declara un object, solo una variable cuyo contenido se interpreta como la dirección de un object de tipo DooDad . Dicha statement, por lo tanto, es como cualquier otra statement que conozca, por ejemplo, al inicializar un int a 0, para que luego pueda asignarle algún valor en una instrucción if .

Una statement como:

  [aDooDad doSomething]; 

es interpretado por el sistema de time de ejecución Objective-C como: enviar un post doSomething al object cuya dirección está almacenada en aDooDad . Si esa dirección es nil no se envía ningún post. Por otro lado, si se descarta un puntero nulo: *aDooDad obtendrá un comportamiento no definido.

Los pointers son cosas de bastante bajo nivel. Espero que esto ayude.

Si está familiarizado con C o C ++, las variables se pueden crear de una de dos maneras, estáticamente en la stack de llamadas o dinámicamente en el montón. La memory variable creada en la stack se recupera cuando el marco de stack actual se sale del ámbito, por lo que nunca tendrá que preocuparse por crearlo o destruirlo. En Objective-C, los objects siempre se crean dinámicamente. Las primitivas (como int, float, pointers, etc.) pueden crearse estática o dinámicamente. Para ilustracion:

 - (id)something { NSObject myObject; // Illegal static object allocation NSObject* myObject; // Legal primitive (pointer) static allocation int myInt; // Legal primitive static allocation int* myIntPtr; // Legal primitive (pointer) static allocation } 

Entonces, cuando dices DooDad* dodad = nil; , estás creando una primitiva (puntero a un DooDad) en la stack. Al ser una variable de stack, no asigna ni desasigna, al igual que no se preocuparía por asignar o desasignar la memory en el siguiente método:

 - (id)allStackVariables { int myInt = 0; float myFloat = 0.0f; float* myFloatPtr = NULL; NSObject* myObject = nil; } 

Configurarlo a nil simplemente establece el contenido de la variable en lo que el comstackdor define como nil , algo así como 0x000000 en hexadecimal. Decir DooDad* dooDad = nil; es conceptualmente idéntico a decir algo así como int myInt = 0;

Declarar simple le proporciona un puntero que puede utilizar más adelante. No se asigna memory.

No estoy seguro de cuál fue la intención del método que publicaste, pero parece mal en muchos niveles. Volverá nula, siempre. A less que sea un método de initialization, no debe llamar a [autoinicio]. Si es un método de initialization, debe volverse uno mismo y tener un nombre similar a "init …"