2012-06-15 32 views
38

He estado intentando encontrar una solución alternativa para declarar propiedades @protected en Objective-C para que solo las subclases de la jerarquía puedan acceder a ellas (solo lectura, no escritura). He leído que no hay una forma documentada de hacerlo así que pensé en esta solución alternativa y quería preguntarle la opinión de StackOverflow al respecto.Solución para lograr propiedades protegidas en Objective-C

Cada clase personalizada en la parte superior de la jerarquía contiene tres clases, una implementación y dos interfaces. Vamos a nombrar ellos:

ClassA.h 
ClassA_protected.h 
ClassA.m 

Entonces, cualquier subclase de esta claseA sería como de costumbre:

ClassB.h 
ClassB.m 

Primero creó la interfaz ClassA.h donde declara una variable int protegida por lo que cualquier subclase de ClassA puede tener acceso a él:

@interface ClassA : NSObject{ 
    @protected 
    int _myProtectedInt; 
} 
@end 

El siguiente paso es la solución de lo que estaba hablando. Sin embargo, una vez que lo lea, verá que es bastante sencillo. Declaré una segunda interfaz llamada ClassA_protected.h que en realidad funciona como una extensión de ClassA.h y nos permite etiquetar la propiedad como readonly:

#import "ClassA.h" 
@interface ClassA() 
@property (nonatomic , readonly) int myProtectedInt; 
@end 

Última etapa de preparación de la jerarquía protegida es declarar su implementación en ClassA.m donde sólo sintetizamos nuestra propiedad:

#import "ClassA_protected.h" 
@implementation ClassA 
@synthesize myProtectedInt = _ myProtectedInt; 
@end 

de esta manera, todas las clases que necesita ser una subclase de ClassA.h, importará ClassA_protected.h en su lugar. Por lo tanto un niño como, por ejemplo ClassB.h, sería la siguiente:

#import "ClassA_protected.h" 
@interface ClassB : ClassA 
@end 

Y un ejemplo de acceder a esta propiedad desde ClassB.m 's aplicación:

@implementation ClassB 
-(void) method { 
    //edit protected variable 
    _myProtectedInt= 1; 

    //normal access 
    self.muProtectedInt; 
} 
@end 
+0

¿Qué pasa si importo "ClassA_protected.h "digamos clase ViewController que solo tiene acceso a ClassB? Aún puedo acceder a la propiedad protegida de ClassA a través del objeto de ClassB en su clase principal (aquí es ViewController class). –

Respuesta

20

Claro , eso funciona bien Apple usa el mismo enfoque, por ejemplo, en la clase UIGestureRecognizer. Las subclases deben importar el archivo adicional UIGestureRecognizerSubclass.h y anular los métodos que se declaran en ese archivo.

+0

No se supone que las variables protegidas sean accesibles por la clase misma y sus subclases? Aún puedo leer la variable de otras clases desde que la hizo de solo lectura, lo que creo que está anulando las reglas de variable protegida – jsetting32

3

Si solicita opinión, esto es mío: Si uno decide a mutar su

_myProtectedInt

que probablemente succed de todos modos, porque es definitivamente posible con Objective-C en tiempo de ejecución. Excepto esto, tu solución está bastante bien.

+0

Gracias por la información! –

7

Para las "propiedades" simples simplemente use ivar en su lugar. Eso es tan bueno como las propiedades para todos los propósitos prácticos.

Además, el valor predeterminado ya está protegido.

+3

Hay algunas situaciones en las que las propiedades son beneficiosas. por ejemplo, compatibilidad con KVO incorporada, capacidad para actuar en la configuración/obtención de una propiedad en un solo lugar (configurador/captador personalizado), el problema de la clase base frágil, etc. – occulus

Cuestiones relacionadas