Objective-C:如何避免对具有相同名称的私有超类方法的意外调用?

Ara*_*cht 5 objective-c

我试图避免各种重复的代码-(id)init一类,即口味init,initWithFrame,initWithCoder通过定义名为的私有方法,等等commonConstruct.

这个方法对所有init方法风格都很常见,并且由init构造函数调用.

我现在的问题是,在派生类中,对初始化助手("commonConstruct")使用相同的命名对流,基类将调用派生类commonConstruct,尽管它是invisible,即在.m文件中声明,而不是在.h文件中.

但是,运行时会找到重载的commonConstruct并执行它而不是它自己的成员函数.

除了在每个子类中为初始化助手使用不同的名称之外,还有其他方法吗?

换句话说:有没有办法使Objective-C成员函数"非虚拟",即没有迟(运行时)但编译时绑定?

rob*_*off 4

没有好的编译器强制方法可以做到这一点。方法始终为 \xe2\x80\x9cvirtual\xe2\x80\x9d 并且不强制执行 \xe2\x80\x9cprivate\xe2\x80\x9d 方法。

\n\n

常见的解决方案是将类名嵌入到方法名中,因此:

\n\n
@implementation Thing\n\n- (instancetype)init {\n    if (self = [super init]) {\n        [self Thing_commonInit];\n    }\n    return self;\n}\n\n- (instancetype)initWithArg:(NSObject *)arg {\n    if (self = [super init]) {\n        [self Thing_commonInit];\n        [self doSomethingWithArg:arg];\n    }\n    return self;\n}\n\n- (void)Thing_commonInit {\n    ...\n}\n
Run Code Online (Sandbox Code Playgroud)\n