问题是我的“私有”方法(_init)被子类意外覆盖,然后再也不会被调用:
@implementation Super
- (void)_init {
}
- (id)init
{
[self _init];
return self;
}
@end
@implementation Sub
- (void)_init {
}
- (id)init
{
self = [super init];
if (self) {
[self _init];
}
return self;
}
@end
我意识到如果我可以将私有方法调用限制到当前类范围(例如C ++中范围解析运算符的影响),那么这种问题只能得到完美解决。但在Objective-C中是否可能?
请注意,告诉我更改我的私人方法名称不是一个问题。这个问题的全部意义在于它是一个意外 - 我可以将其他类的子类化,并偶然发现它的私有方法。
答案 0 :(得分:3)
一种解决方案是避免使用[]
来发送邮件,而是使用IMP
:
- (id)init {
self = [super init];
if (! self) return nil;
// get the implementation pointer of -[Super _init]...
IMP superInit = class_getMethodImplementation([Super class], @selector(_init));
// ...and call it
superInit(self, @selector(_init));
return self;
}
或者,如果您不希望子类完全看到该方法,请改为使用文件范围函数:
static void customInit(Super *self) {
}
- (id)init {
self = [super init];
if (self) customInit(self);
return self;
}
请记住,如果您在Apple平台上进行开发,那么不应使用下划线作为前缀来表示方法是私有的:Apple reserves this convention。否则,您可能无意中凌驾于Apple私有方法之上。