我试图避免各种重复的代码-(id)init一类,即口味init,initWithFrame,initWithCoder通过定义名为的私有方法,等等commonConstruct.
这个方法对所有init方法风格都很常见,并且由init构造函数调用.
我现在的问题是,在派生类中,对初始化助手("commonConstruct")使用相同的命名对流,基类将调用派生类commonConstruct,尽管它是invisible,即在.m文件中声明,而不是在.h文件中.
但是,运行时会找到重载的commonConstruct并执行它而不是它自己的成员函数.
除了在每个子类中为初始化助手使用不同的名称之外,还有其他方法吗?
换句话说:有没有办法使Objective-C成员函数"非虚拟",即没有迟(运行时)但编译时绑定?
没有好的编译器强制方法可以做到这一点。方法始终为 \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}\nRun Code Online (Sandbox Code Playgroud)\n