2012-07-03 23 views
11

que tienen la siguiente interfaz de clase:ObjectiveC: ¿dónde declarar las propiedades de instancias privadas?

@interface MyClass : NSObject 

@property int publicProperty; 

@end 

entonces la aplicación:

@interface MyClass() // class extension 

- (void)privateMethod; // private methods 

@end 

@implementation MyClass { 
    int _privateProperty; 
} 

@property int privateProperty = _privateProperty; 

@end 

esto es lo que el tipo de Apple mostró en la WWDC, pero ¿hay alguna razón para no poner _privateProperty en extensión clase como :

@interface MyClass() // class extension 
{ 
    int _privateProperty; 
} 

- (void)privateMethod; // private methods 

@end 

Gracias!

+0

Usted puede encontrar muchas buenas respuestas a su pregunta aquí: http://stackoverflow.com/search?q=private+property – Monolo

+0

posible dup licate de [¿Cómo hacer una propiedad privada?] (http://stackoverflow.com/questions/2768750/how-to-make-a-private-property) – Monolo

Respuesta

5

usted no tiene que declarar sus Ivars, tanto en la interfaz y el implementation.Because desea que sean privadas sólo les puede declarada en el archivo de implementación de esta manera:

@implementation { 

int firstVariable; 
int secondVariable; 
... 
} 
//properties and code for your methods 

Si lo desea, puede crear métodos getter y setter para que pueda acceder a esas variables.

La persona con la que habló estaba en lo cierto, pensó que no había ninguna razón por la que NO los declararía de la misma manera en la interfaz. Algunos libros realmente te enseñan que la interfaz @ muestra la cara pública de la clase y que lo que tienes en la implementación será privado.

0

¿Quiere decir que quiere declarar variables de instancias privadas?

Usted puede hacer esto:

@interface MyClass() 
{ 
@private //makes the following ivar private 
    int _privateProperty; 
} 
+0

Sí, pero no quiero que sea ivar, es solo una propiedad a la que se puede acceder desde self.privateProperty utilizando el acceso y no está expuesta en @interface. – hzxu

+0

No puede hacerlo con este '@property int privateProperty = _privateProperty;', tiene que hacerlo en el archivo de implementación. –

0

Con el "tiempo de ejecución moderno" (64 bits de MacOS post-10.5 y todas las versiones de iOS), no necesita declarar variables de instancia en absoluto.

// MyClass.h 
@interface MyClass : NSObject 

@property int publicProperty; 

@end 


// MyClass.m 
@implementation MyClass 

@synthesize publicProperty = _privateProperty; // int _privateProperty is automatically synthesized for you. 

@end 
9

lo general "fuerza" privado con una extensión en la implementación

En su cabecera

@interface MyClass : NSObject 
{ 
} 

@property (nonatomic, assign) int publicProperty; 

@end 

En el archivo de aplicación:

@interface MyClass() 
@property (nonatomic, assign) int privateProperty; 
@end 


@implementation MyClass 
@synthesize privateProperty; 
@synthesize publicProperty; 

@end 
Cuestiones relacionadas