合成された読み取り専用プロパティを持つクラスのサブクラスは、Objective-C のインスタンス変数にアクセスできません。質問する

合成された読み取り専用プロパティを持つクラスのサブクラスは、Objective-C のインスタンス変数にアクセスできません。質問する

スーパークラスではMyClass:

@interface MyClass : NSObject

@property (nonatomic, strong, readonly) NSString *pString;

@end

@implementation MyClass

@synthesize pString = _pString;

@end

サブクラスではMySubclass

@interface MySubclass : MyClass

@end

@implementation MySubclass

- (id)init {
    if (self = [super init]) {
        _pString = @"Some string";
    }
    return self;
}

問題は、コンパイラが_pStringが のメンバーであると認識しないことですMySubclassが、 で にアクセスする際には問題はありませんMyClass

何が足りないのでしょうか?

ベストアンサー1

_pString生成されるインスタンス変数@synthesizeプライベートMyClass。あなたはそれをする必要があります保護されたMySubclassアクセスできるようにするためです。

次のように、のセクション_pStringにの ivar 宣言を追加します。@protectedMyClass

@interface MyClass : NSObject {
    @protected
    NSString *_pString;
}

@property (nonatomic, strong, readonly) NSString *pString;

@end

ここで、通常どおりアクセサーを合成すると、変数がサブクラスからアクセスできるようになります。

おすすめ記事