2010-11-02 15 views
8

¿Cuándo debería usar la expresión self en mis aplicaciones de desarrollo de iphone? Supongo que tengo 2 campos: UITextField *text1; y NSString *str1; conservados y sintetizados.¿Cuándo debería usar la palabra clave "self"?

cuando estoy accediendo a cualquiera de estos 2 campos, ¿cuándo debería y cuándo no debería usar self.text1 y self.str1?

Respuesta

7

Hay ciertas circunstancias en las que generalmente se desaconseja utilizar el self.-expresión acceder a una propiedad. Normalmente siempreusoselfpara cualquier acceso de una propiedad. Es la forma más segura y sencilla. Especialmente si usó Retener, la administración de la memoria se hará por usted.

Las dos excepciones a esta regla:

  • Cualquier init método.
  • En dealloc.

En ambos casos se trata de un objeto parcialmente inicializado objeto. Hay algunos efectos secundarios que pueden ocurrir al usar setters o getters aquí, porque son métodos y, por lo tanto, pueden ser anulados.

Por ejemplo, tomar una clase con una propiedad Afoo que ha sido una subclase de la clase B. La subclase B agrega una propiedad bar y anula al colocador para foo. Ahora su init -metodo llama al setFoo:, porque usó self.foo = ... con algún valor inicial. La subclase, sin embargo, también tiene acceso al valor de bar en este setter. Pero en este caso, puede suceder que la barra nunca se haya inicializado y apunte a datos arbitrarios. Llamar a un colocador en init mi causa se bloquea, aunque la probabilidad puede no ser demasiado alta en su propio código.

8

self no es una palabra clave, es una expresión. Además, lo usa en cualquier momento que quiera referirse a un método o propiedad sobre usted o directamente sobre usted. Por "usted mismo", por supuesto, me estoy refiriendo a la instancia de la clase en la que está operando.

+1

por lo que parece que es idéntica a la expresión 'this' de Java, que no siempre es necesaria a menos que se trate de variables con el mismo nombre – binnyb

+0

Estás en lo cierto. –

+12

Una diferencia importante es que 'self.str1 = @" abc "' usará el método de acceso ('setStr1:') pero 'str1 = @" abc "' no lo hará. Al usar propiedades con el atributo 'retener', esta diferencia es crítica. Entonces, realmente no es "idéntico a Java 'esto'". –

0

No sé nada sobre objetivo-c, pero esto se parece mucho a this palabra clave de otros idiomas (como C++ , C#, Java, PHP y otros). Si es así, entonces mi consejo es usarlo siempre. De esta forma, si alguna vez (accidentalmente) define una variable local con el mismo nombre, su código no se romperá.

Sin embargo, también debo añadir, que esto es algo así como un debate religioso con una historia de flamewars en las comunidades de programadores. Así que tome este consejo con un grano de sal y use lo que le parezca más lógico. Solo sé consecuente al respecto.

+0

Pero tenga en cuenta que no es solo un problema de estilo/mantenimiento en el objetivo-C: cuando se utiliza una propiedad que tiene métodos getter/setter, omitiendo el "' self "se salta el getter/setter; hay una diferencia semántica real. –

+0

eso es exactamente lo que estaba buscando, bueno – binnyb

+0

@David Gelhar - lo siento. Te dije que no sabía. : P –

6

En su ejemplo, no está accediendo directamente a las variables de instancia cuando usa self, sino que está accediendo a las propiedades que ha definido.

Considere este ejemplo:

@interface Foo : NSObject { 
    NSString *_bar; 
} 

@property (nonatomic, retain) NSString *bar; 

@end 

@implementation Foo 
@synthesize bar = _bar; 
-(void)baz { 
    _bar = @"ivar"; //accessing the ivar 
    self.bar = @"property"; //accessing the ivar via the property 
} 

@end 

En general, si usted está utilizando propiedades, hay pocas razones para utilizar el Ivar. Esto tiene el beneficio adicional de retener automáticamente & liberando valores para usted.

Pero existen otros casos cuando sus propiedades tendrán un modificador readonly. En estos casos, es necesario acceder directamente a sus ivars para establecer sus valores.

+0

Estoy confundido. ¿Dónde se declara _foo y foo? ¿Deberían ser realmente _bar y bar en su método Baz? –

+0

lo siento, hice un error tipográfico en mi propio ejemplo. corregido –

5

También es una buena idea usar self dentro de una llamada de método a veces si tiene un getter personalizado. El objeto managedContext dentro de una aplicación Core Data-using es un buen ejemplo. Si se refiere a él por self.managedContext, puede anular y establecer el objeto a lo que debe ser si es nil. Consulte el código generado por XCode al crear una aplicación que utiliza datos principales.

Aquí se muestra un ejemplo del código generado por XCode, en realidad:

@interface YourAppDelegate : NSObject <UIApplicationDelegate> 
{ 
@private 
    NSManagedObjectContext *managedObjectContext_; 
} 


@property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext; 



@implementation ContractionTimerAppDelegate 

/** 
Returns the managed object context for the application. 
If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application. 
*/ 
- (NSManagedObjectContext *)managedObjectContext { 

    if (managedObjectContext_ != nil) { 
     return managedObjectContext_; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext_ = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext_ setPersistentStoreCoordinator:coordinator]; 
    } 
    return managedObjectContext_; 
} 

@end 
1

si "sintetiza" la variable, debe "self". La variable. regla general

Cuestiones relacionadas