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
¿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). –