ultima tutorial objective logo objective-c

objective-c - tutorial - objective c vs swift



propiedad privada en Objective C (4)

¿Hay alguna manera de declarar una propiedad privada en el Objetivo C? El objetivo es beneficiarse de getters y setters sintetizados que implementan un cierto esquema de administración de memoria, pero que no están expuestos al público.

Un intento de declarar una propiedad dentro de una categoría genera un error:

@interface MyClass : NSObject { NSArray *_someArray; } ... @end @interface MyClass (private) @property (nonatomic, retain) NSArray *someArray; @end @implementation MyClass (private) @synthesize someArray = _someArray; // ^^^ error here: @synthesize not allowed in a category''s implementation @end @implementation MyClass ... @end


Como otros han indicado, (actualmente) no hay forma de declarar verdaderamente una propiedad privada en Objetive-C.

Una de las cosas que puede hacer para tratar de "proteger" las propiedades de alguna manera es tener una clase base con la propiedad declarada como de readonly y en sus subclases puede redeclarar la misma propiedad que readwrite .

La documentación de Apple sobre propiedades redeclaradas se puede encontrar aquí: http://developer.apple.com/library/ios/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17- SW19


Depende de lo que quieras decir con "privado".

Si solo quiere decir "no documentado públicamente", puede usar una extensión de clase en un encabezado privado o en el archivo .m.

Si quiere decir "los demás no pueden llamarlo para nada", no tiene suerte. Cualquiera puede llamar al método si conocen su nombre, incluso si no está documentado públicamente.


Implemento mis propiedades privadas de esta manera.

MyClass.m

@interface MyClass () @property (nonatomic, retain) NSArray *someArray; @end @implementation MyClass @synthesize someArray; ...

Eso es todo lo que necesitas.


A. Si quieres una variable completamente privada. No le des una propiedad.
B. Si desea una variable de solo lectura accesible desde la encapsulación de la clase, use una combinación de la variable global y la propiedad:

//Header @interface Class{ NSObject *_aProperty } @property (nonatomic, readonly) NSObject *aProperty; // In the implementation @synthesize aProperty = _aProperty; //Naming convention prefix _ supported 2012 by Apple.

Usando el modificador de solo lectura ahora podemos acceder a la propiedad en cualquier lugar externamente.

Class *c = [[Class alloc]init]; NSObject *obj = c.aProperty; //Readonly

Pero internamente no podemos establecer una propiedad dentro de la clase:

// In the implementation self.aProperty = [[NSObject alloc]init]; //Gives Compiler warning. Cannot write to property because of readonly modifier. //Solution: _aProperty = [[NSObject alloc]init]; //Bypass property and access the global variable directly