sale descargar cuando apple iphone objective-c ios

iphone - descargar - Diferencia entre self.ivar e ivar?



ios 12 cuando sale (4)

aclass.h @interface aClass : NSObject { NSString *name; } @property (nonatomic, retain) IBOutlet NSString *name; @end

aclass.m @implementation aClass @synthesize name; - (void)dealloc { [name release]; [super dealloc]; } - (void)test1 { name = @"hello"; } - (void)test2 { self.name = @"hello"; }

Tome arriba como un ejemplo. ¿Podría alguien explicar la diferencia entre name = @"hello" y self.name = @"hello" ? ¡Gracias!

EDIT: Pregunta de seguimiento: ¿Cómo escribir mi propio setter para un ivar, es decir: self.ivar = ...?


TEN EN CUENTA, ESTE POST ES VIEJO!

Esta publicación es de la década anterior.

¡Asegúrate de leer la nota importante abajo, aplausos!

Es realmente difícil de entender todo esto, cuando recién estás comenzando.

Aquí hay algunas reglas prácticas SENCILLAS Y PRÁCTICAS PARA PRINCIPIANTES .

Para repetir, esta publicación es PARA PRINCIPIANTES .

El objetivo aquí es permitirle moverse rápidamente desde la línea de partida, para poder usar el sistema con confianza en la mayoría de las situaciones.

Más adelante , puedes aprender sobre el funcionamiento interno de estos problemas.

(1) No digas name=@"hello" . Siempre diga self.name=@"hello" . Realice una búsqueda de name y asegúrese de decir siempre self.name y not name , cuando lo establece o lo cambia.

(2) Usted sabe todas esas cosas exasperantes sobre la gestión de la memoria, la inicialización, la liberación, etc. Si usa el self thingy, se ocupa de todo eso por usted . Genial, ¿eh?

(3) El self thingy es particularmente útil porque puedes "cambiar" fácilmente la cuerda (o lo que sea) a medida que avanzas. Entonces, está totalmente bien hacer esto,

self.name=@"aa"; self.name=@"bb"; self.name=@"cc";

mientras que (en una palabra) nunca, nunca, nunca, por ninguna razón, puede hacer esto ...

name=@"aa"; name=@"bb"; name=@"cc";

(*) Con respecto a su pregunta literal, "explique la diferencia entre name = @"hello" y self.name = @"hello"?" Esto es fácil de hacer.

El primero es solo establecer una variable . Sabes, exactamente como "x=42" en los viejos tiempos cuando la vida era simple y teníamos 13 años.

El segundo es completamente diferente, específicamente está llamando a una rutina complicada (conocida como "la incubadora") para hacer un montón de cosas increíbles y sorprendentes para ti.

Entonces esa es la respuesta literal a tu pregunta. El primero solo establece la variable (y no se olvide, hay muchos punteros y otras cosas extrañas involucradas, y como regla, ciertamente no puede simplemente establecer punteros de esa manera). El segundo realmente llama una gran rutina complicada y por lo tanto hace un montón de cosas para ti.

Una vez más, el segundo es exactamente como decir ...

[name bigComplicatedRoutineHere:@"hello"];

... es muy útil recordar siempre que la sintaxis es self. ... self. ... está llamando literalmente una rutina .

De hecho, algunos pensadores sobre el tema pensaron que era una idea tonta cuando introdujeron esta sintaxis self.X para significar [X complicatedThingHere] . Inunda una gran confusión, y cada principiante pregunta exactamente lo que estás preguntando .

Personalmente, me tomó más de nueve años aclarar esto en mi cabeza. :-) Así que de nuevo, enfatizo que debes recordar eso cuando dices self.x , de hecho, en realidad estás llamando a una rutina .

Para repetir: la sintaxis de "punto propio" de hecho llama una rutina. (De hecho, creo que uno de los preprocesadores simplemente lo expande a [x amazingStuffHere] ).

He intentado responder de una manera que lo mantendrá activo y le permitirá avanzar y usar más características, mientras aprende sobre administración de memoria, propiedades, etc. Si estás más avanzado que este post, solo ignóralo.

Tenga en cuenta que esta publicación está destinada a ser un consejo para principiantes para que puedan seguir y no enfurecerse . ¡Espero eso ayude!

Actualización 2014! Nota importante sobre ARC para principiantes ...

Tenga en cuenta que esta publicación ya tiene cinco años . Ha sido leído por miles de principiantes y ha habido muchas preguntas de seguimiento, etc. Tenga en cuenta que hoy en el nuevo "mundo ARC". Hasta cierto punto: si eres un principiante: ¡deberías usarlo! propiedades. es decir, use "self.whatever" en todo momento, en todas partes. En cualquier caso, solo tenga en cuenta que la información en esta publicación es "en gran medida histórica" ​​y se está volviendo más común cada día. Por supuesto, no hace falta decir que una vez que seas un experto, necesitarás y entenderás cada detalle sutil de todo esto. Espero que ayude a alguien.


Es real una gestión de memoria, primero la propiedad gramática es el método setter y getter real, cuando use self.xxx =?, Podría llamar al método setter, el objeto retener cout +1, el nombre no puede ser liberado, sin embargo, si name = foo es nada sobre la gramática de la propiedad.

ejemplo del método setter:

-(void)setObj:(ClassX*) value { if (obj != value) { [obj release]; obj = [value retain]; } }


self.name usa el acceso y / o mutador definido por usted (esto no es atómico y lo conserva en su caso). Entonces cuando llame a self.name = foo , llamará al setName:(NSString *)str generado por el compilador, que primero liberará la cadena actual, luego conservará la nueva cadena y finalmente asignará el nombre a la cadena retenida.

Simplemente llamando a name = foo no hace nada más que asignarle un nombre a foo.

Esto también significa que solo puede llamar a self.xxx cuando haya definido una propiedad para el ivar, de lo contrario, el compilador le informará que no lo sabe (iVar).


name = @ "Joe"

Está accediendo directamente a la variable, evitando el método getter que Cocoa se tomó la molestia de crear para usted. Usualmente, no es lo más sabio de hacer.

self.name = @ "Joe"

Ahora sigue el método que le pediste a Cocoa que creara para ti. Esta es usualmente la mejor manera.

Como regla general, use siempre setter y getter proporcionados por Cocoa, con UNA excepción: dealloc. En dealloc, siempre debe liberar la variable directamente, no a través del método getter:

-(void) dealloc { [name release]; // instead of [[self name] release] ... [super dealloc]; }

La razón para evitar los descriptores de acceso en dealloc es que si hay observadores o una anulación en una subclase que activa el comportamiento, se desencadenará desde dealloc, que prácticamente nunca es lo que desea (porque el estado del objeto será inconsistente).

OTOH, también hay una sintaxis un poco más conveniente para declarar iVars que tal vez no conozcas. Si solo está apuntando a Mac de 64 bits, puede usar propiedades para generar ambos métodos de acceso y la variable de instancia en sí misma:

#import <Cocoa/Cocoa.h> @interface Photo : NSObject @property (retain) NSString* caption; @property (retain) NSString* photographer; @end