Ho cercato di trovare una soluzione alternativa per dichiarare le proprietà protette @ in Objective-C in modo che solo le sottoclassi nella gerarchia possano accedervi (sola lettura, non scrittura). Ho letto che non esiste un modo documentato per farlo, quindi ho pensato a questa soluzione alternativa e volevo chiedere l'opinione di StackOverflow al riguardo.Soluzione alternativa per eseguire le proprietà protette in Objective-C
Ogni classe personalizzata nella parte superiore della gerarchia contiene tre classi, un'implementazione e due interfacce. Diamo loro un nome:
ClassA.h
ClassA_protected.h
ClassA.m
Poi ogni sottoclasse di questo ClasseA sarebbe come al solito:
ClassB.h
ClassB.m
Per prima cosa ho creato l'interfaccia ClassA.h dove dichiaro una variabile int protetta in modo che qualsiasi sottoclasse di ClassA può accedervi:
@interface ClassA : NSObject{
@protected
int _myProtectedInt;
}
@end
Il passaggio successivo è la soluzione di cui stavo parlando. Tuttavia, una volta letto, vedrai che è abbastanza semplice. Ho dichiarato una seconda interfaccia denominata ClassA_protected.h che in realtà funziona come un prolungamento di ClassA.h e ci permette di etichettare la proprietà come readonly
:
#import "ClassA.h"
@interface ClassA()
@property (nonatomic , readonly) int myProtectedInt;
@end
Ultima fase di preparazione della gerarchia protetta è di dichiarare la sua attuazione in ClassA.m cui sintetizziamo solo la nostra proprietà:
#import "ClassA_protected.h"
@implementation ClassA
@synthesize myProtectedInt = _ myProtectedInt;
@end
in questo modo, ogni classe che ha bisogno di essere una sottoclasse di ClassA.h, importa invece ClassA_protected.h. Quindi un bambino come, per esempio ClassB.h, sarebbe la seguente:
#import "ClassA_protected.h"
@interface ClassB : ClassA
@end
E un esempio di accesso questo immobile dal implementazione ClassB.m s':
@implementation ClassB
-(void) method {
//edit protected variable
_myProtectedInt= 1;
//normal access
self.muProtectedInt;
}
@end
Cosa succede se importo "ClassA_protected.h "per esempio la classe ViewController che accede solo a ClassB? Posso ancora accedere alla proprietà protetta di ClassA tramite l'oggetto di ClassB nella classe principale (qui è classe ViewController). –