2012-06-15 17 views
38

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 
+0

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

risposta

20

Sicuro , funziona bene Apple usa lo stesso approccio, ad esempio, nella classe UIGestureRecognizer. Le sottoclassi devono importare il file UIGestureRecognizerSubclass.h aggiuntivo e sovrascrivere i metodi dichiarati in quel file.

+0

Le variabili non protette dovrebbero essere accessibili dalla classe stessa e dalle sue sottoclassi? Sono ancora in grado di leggere la variabile da altre classi da quando la stai leggendo, che penso stia annullando le regole variabili protette – jsetting32

3

Se chiedete parere, questo è il mio: se si decide di mutare il tuo

_myProtectedInt

lui probabilmente succed in ogni caso, perché è sicuramente possibile con Objective-C runtime. Tranne questo, la tua soluzione è abbastanza OK.

+0

Grazie per l'informazione! –

7

Per semplici "proprietà" è sufficiente utilizzare invece ivar. Questo è buono come proprietà per tutti gli scopi pratici.

Inoltre, il valore predefinito è già protetto.

+3

Ci sono alcune situazioni in cui le proprietà sono vantaggiose. ad es. conformità KVO, capacità di agire in fase di impostazione/acquisizione di un immobile in un singolo luogo (setter personalizzato/getter), fragile problema di classe base, ecc. – occulus

Problemi correlati