objective-c - tutorial - qualificatori java
Sottoclasse di classi con proprietà readonly sintetizzate non possono accedere alla variabile di istanza in Objective-C (2)
Ho familiarità con questo problema. Sintetizzi la variabile nella tua classe .m, quindi non viene importata insieme all'intestazione poiché la variabile _pString verrà creata come parte dell'implementazione e non dell'interfaccia. La soluzione è dichiarare _pString nell'interfaccia dell'header e quindi sintetizzarlo comunque (userà la variabile esistente invece di crearne una privata).
@interface MyClass : NSObject
{
NSString *_pString; //Don't worry, it will not be public
}
@property (nonatomic, strong, readonly) NSString *pString;
@end
Nella superclasse MyClass
:
@interface MyClass : NSObject
@property (nonatomic, strong, readonly) NSString *pString;
@end
@implementation MyClass
@synthesize pString = _pString;
@end
Nella sottoclasse MySubclass
@interface MySubclass : MyClass
@end
@implementation MySubclass
- (id)init {
if (self = [super init]) {
_pString = @"Some string";
}
return self;
}
Il problema è che il compilatore non pensa che _pString
sia un membro di MySubclass
, ma non ho problemi ad accedervi in MyClass
.
Cosa mi manca?
La risposta data funziona perfettamente. Questa è una risposta alternativa, che a quanto pare Apple ama un po 'di più .
È possibile definire un'estensione privata della classe, un file MyClass+Protected.h
, che deve essere incluso in MyClass.m
e MySubclass.m
.
Quindi, in questo nuovo file, ridefinisci la proprietà come readwrite
.
@interface MyClass ()
@property (strong, readwrite) NSString * pString;
@end
Questa alternativa consente di utilizzare l'accessore self.pString
piuttosto che l'ivar _pString
.
Nota: è ancora necessario mantenere la definizione di pString
in MyClass.h
com'è.