在类扩展中声明新属性是Objective-C中的一个不好的做法吗?

Jim*_*mmy 3 properties objective-c modern-runtime class-extensions

类扩展的一个强大优势是,使用类扩展,您可以在头文件中声明readonly属性,并在类扩展中将此属性覆盖为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
Run Code Online (Sandbox Code Playgroud)

但是如果你使用现代运行时,你也可以在类扩展中声明一个全新的属性(如果没有,也为该属性生成一个iVar).

//SomeClass.h

@interface SomeClass : NSObject
{
}
@end

//SomeClass.m
@interface SomeClass ()
@property (readwrite) NSInteger someInt;
@end

@implementation SomeClass
@synthesize someInt;
@end
Run Code Online (Sandbox Code Playgroud)

这是我的问题:我认为在课堂扩展中声明一个全新的属性在某种程度上会产生一些副作用.因为类扩展我不在头文件中,而另一个继承类的人可能不知道那个"秘密属性".如果他宣布一个与该"秘密财产"同名的财产.而这个新属性的getter和setter方法将覆盖超类.这不是问题吗?为什么现代运行时会允许这样的事情发生?

编辑我发布了关于这个主题的另一个问题,请查看: 在类扩展(Ojbective-C)中声明新的propery的风险,如何解决?

Mat*_*ing 6

我不认为在类扩展中声明一个新属性是不好的做法.我这样做的频率很高.首先在头中包含readonly属性的唯一原因是允许其他类获取值,而只允许您修改它.很多时候,ivar应该与其他类无关,并且只是一个实现细节.因此,它在头文件中没有位置.

将此ivar实现为私有属性(仅在类扩展中声明的新属性)仍然有用,因为它可以为您抽象的方便的内存管理样板代码.不幸的是,名称冲突只是Objective C中的一个事实.Apple规定了一些非常清晰的命名约定,供您遵循(或遵循)以防止与其方法名称发生冲突.如果你担心你已经无形地与私有财产创造的getter和setter碰撞,只是采纳和痴迷按照您的私有属性名称的一些命名约定实现私有财产时,曾经使用过.这是你用Objective C做的最好的,但我个人认为好处大于风险.