日々精進

新しく学んだことを書き留めていきます

protectedなプロパティにアクセスすると「unrecognized selector sent to instance」になる

以下のように、Protected.hで宣言しているプロパティがある場合、

// AbstractViewController_Protected.h
@property (nonatomic) NSObject *obj;

このクラスのサブクラスのインスタンスからこのプロパティにアクセスするとエラーになる。

// ConcreteViewController.m
self.obj = @"test"; // unrecognized selector sent to instance

よく考えたらAbstractViewController_Protected.hはカテゴリでメソッドを定義するのでインスタンス変数は作れない。。
protectedなプロパティでインスタンス変数を作りたい場合は、無名カテゴリにもプロパティを宣言しないといけない。

// AbstractViewController.m
@interface AbstractViewController ()
@property (nonatomic, readwrite) NSObject *obj;
@end

これはぱっと見なんで無名カテゴリにプロパティ宣言が必要なのかわからないからイヤだなぁ。