21 votos

Solución para lograr propiedades protegidas en Objective-C

He estado tratando de encontrar una solución para que declare @propiedades protegidas en Objective-C, por lo que sólo las subclases de la jerarquía pueden acceder a ellos (de sólo lectura, no escritura). He leído que no hay documentado manera de hacer esto así que he pensado en esta solución y quería preguntar StackOverflow opinión al respecto.

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

ClassA.h
ClassA_protected.h
ClassA.m

Entonces cualquier subclase de esta ClassA sería como de costumbre:

ClassB.h
ClassB.m

Primero he creado la interfaz de ClassA.h donde declaro protegida variable de tipo int por lo que cualquier subclase de ClassA puede tener acceso a ella:

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

El próximo paso es la solución que estaba hablando. Sin embargo, una vez que la lees verás que es muy sencillo. Yo he declarado una segunda interfaz denominada ClassA_protected.h que en realidad funciona como una extensión de ClassA.h y nos permite etiqueta de la propiedad como readonly:

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

El último paso de la preparación de los protegidos de la jerarquía es declarar su aplicación en ClassA.m que sólo nos sintetizar nuestra propiedad:

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

De esta manera, cada una de las clases que debe ser una subclase de ClassA.h, importación ClassA_protected.h lugar. Así que un niño como, por ejemplo ClassB.h, sería como sigue:

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

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

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

    //normal access
    self.muProtectedInt;
}
@end

13voto

Ole Begemann Puntos 85798

Seguro, que funciona bien. Apple utiliza el mismo enfoque, por ejemplo, en la UIGestureRecognizer de la clase. Las subclases tienen que importar el adicional UIGestureRecognizerSubclass.h archivo y reemplazar los métodos que se declaran en el archivo.

4voto

Septiadi Agus Puntos 632

Por simple "propiedades" sólo uso ivar lugar. Que es tan buena como las propiedades para todos los propósitos prácticos.

Por otra parte, el valor predeterminado es que ya está protegido.

2voto

Oleg Trakhman Puntos 1717

Si pides opinión, esta es la mía: Si uno decide mutar su

_myProtectedInt

él probablemente succed de todos modos, porque es definitivamente posible con Objective-C en tiempo de ejecución. Salvo esto, la solución es bastante aceptable.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X