@propertyはprotected?
以下の記事は完全に間違っていました。
このような間違いを書いた原因を追記しました。http://d.hatena.ne.jp/masakih/20120430/1335753725
とりあえず、仕様にないような気がするので非推奨
外部にはreadonly, 内部ではreadwriteなプロパティを持つクラスがあります。
インターフェイスファイル
外部にはreadonly, 内部ではreadwriteなプロパティを持つクラスがあります。
インターフェイスファイル
@interface AClass : NSObject @property (readonly, copy) NSString *title; @end
実装ファイル
@interface AClass () @property (readwrite, copy) NSString *title; @end @implementation AClass @synthesize title; @end
こんなの。ごく普通。
で、このクラスをサブクラス化し、かつ、titleプロパティはサブクラスで変更でしたい。
素直に書くならこう。
インターフェイスファイル
@interface BClass : AClass @end
実装ファイル
@interface BClass () @property (readwrite, copy) NSString *title; @end @implementation BClass @synthesize title = _bTitle; - (void)hoge { self.title = @"hoge"; } @end
titleプロパティをreadwriteで再宣言して、自動合成する。
これが、多分普通。*1
が、いつもの事ながら、そういうのを一切忘れてこう書いたら、コンパイルが通った。
実装ファイル
@implementation BClass - (void)hoge { self.title = @"hoge"; } @end
readwriteで再宣言してません。
もちろん、スーパークラス(AClass)の実装がここから見える訳もありません。
そして、プロパティは静的チェックが行われています。
が、コンパイル出来ちゃった。
多分ドキュメント化されてない。
コンパイラのバグとも取れるが。
*1:あれだけatomicが云々言ってた建前上こうなりました