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'è.





subclass