readonly として継承され、継承されたクラスで readwrite として再宣言されたプロパティを操作しているときに、奇妙な動作を発見しました。
イン・アー
@interface A : NSObject
@property (nonatomic, strong, readonly) NSObject * someProperty;
@end
Bhで
@interface B : A
// no matter if here
// @property (nonatomic, strong, readwrite) NSObject * someProperty;
- (void)foo;
@end
Bmで
@interface B()
// no matter if here
@property (nonatomic, strong, readwrite) NSObject * someProperty;
@end
@implementation B
- (void)foo {
NSLog(@"%@", self.someProperty);
// crash here with unrecognized selector setSomeProperty:
self.someProperty = [NSObject new];
}
@end
呼び出し
self.someProperty = [NSObject new];
認識されないセレクター「setSomeProperty:」でコードがクラッシュします。
調査によると、読み取り書き込みとして宣言されていても、セッターが合成されていないように見えます
なぜこうなった?コンパイラは、これが発生することに対する警告を示しませんでした。また、この動作が文書化されている場所も見つかりませんでした