2011-08-09 28 views
9

Alguien me dijo que podría hacer que las propiedades privadas de modo que sólo una instancia de la clase puede referirse a ellos (a través de uno mismo.)¿Cómo hacer que las propiedades sean privadas?

Sin embargo, si uso @private en la interfaz de la clase y luego declaro la propiedad normalmente, todavía se puede acceder desde fuera de la clase ... Entonces, ¿cómo puedo hacer que las propiedades sean privadas? Ejemplo de sintaxis por favor.

Respuesta

20

Debe incluir estas propiedades en una extensión de clase. Esto le permite definir propiedades (y más recientemente iVars) dentro de su archivo de implementación en una declaración de interfaz. Es similar a definir una categoría pero sin un nombre entre paréntesis.

Así que si este es el archivo de MyClass.m:

// Class Extension Definition in the implementation file 
@interface MyClass() 

@property (nonatomic, retain) NSString *myString; 

@end 

@implementation MyClass 

- (id)init 
{ 
    self = [super init]; 
    if(self) 
    { 
     // This property can only be accessed within the class 
     self.myString = @"Hello!"; 
    } 
} 

@end 
+4

Tenga en cuenta que la extensión de clase puede estar en un archivo de encabezado que importa #import en las clases que necesitan acceso, lo que permite efectivamente una propiedad "biblioteca privada". – bbum

5

declarar la propiedad del archivo de aplicación (.m), así:

@interface MyClass() 

@property (nonatomic, retain) MyPrivateClass *secretProperty; 

@end 

podrás utilizar esa propiedad dentro de su clase sin una advertencia de compilación.

+0

¿Cuál es la ventaja de crear una propiedad allí. Podemos usar directamente ivar.¿Hay alguno? – Imran

+1

Las ventajas son la consistencia (las propiedades públicas y privadas se acceden de la misma manera), la claridad (las propiedades se parecen a las propiedades) y la flexibilidad (todos los accesos de propiedad pasan por el mismo método, por lo que la carga diferida, las propiedades calculadas, etc. son triviales) . – kubi

Cuestiones relacionadas