@propertyはprotected?

以下の記事は完全に間違っていました。

このような間違いを書いた原因を追記しました。http://d.hatena.ne.jp/masakih/20120430/1335753725

とりあえず、仕様にないような気がするので非推奨
外部には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が云々言ってた建前上こうなりました