类扩展的一个强大优势是,通过类扩展,您可以在头文件中声明一个只读属性,并在类扩展中将该属性覆盖为读写属性。如下所示:
//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),如何解决?