クラス拡張の大きな利点の 1 つは、クラス拡張を使用すると、ヘッダー ファイルで読み取り専用プロパティを宣言し、クラス拡張でこのプロパティを readwrite プロパティとしてオーバーライドできることです。以下のように:
//SomeClass.h
@interface SomeClass : NSObject
{
NSInteger someInt; //with modern runtime you can omit this line
}
@property (readonly) NSInteger someInt;
@end
//SomeClass.m
@interface SomeClass ()
@property (readwrite) NSInteger someInt;
@end
@implementation SomeClass
@synthesize someInt;
@end
ただし、最新のランタイムを使用する場合は、クラス拡張でまったく新しいプロパティを宣言することもできます (存在しない場合は、そのプロパティの iVar も生成します)。
//SomeClass.h
@interface SomeClass : NSObject
{
}
@end
//SomeClass.m
@interface SomeClass ()
@property (readwrite) NSInteger someInt;
@end
@implementation SomeClass
@synthesize someInt;
@end
これが私の質問です。クラス拡張でまったく新しいプロパティを宣言すると、どういうわけか副作用があると思います。クラス拡張はヘッダー ファイルにない可能性があり、クラスをサブクラス化する他の誰かがその「秘密のプロパティ」について知らない可能性があるためです。そして、彼がその「秘密のプロパティ」と同じ名前のプロパティを宣言した場合。そして、この新しいプロパティの getter メソッドと setter メソッドは、スーパー クラスのメソッドをオーバーライドします。これは問題ではありませんか?そして、なぜ現代のランタイムはそのようなことが起こるのを許すのでしょうか?
編集 このトピックについて別の質問を投稿しました。チェックしてください: クラス拡張 (Ojbective-C) で新しいプロパティを宣言するリスク、解決方法は?