在Objective-C中将方法调用限制为特定的类范围

时间:2011-05-19 03:32:02

标签: objective-c

问题是我的“私有”方法(_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中是否可能?

请注意,告诉我更改我的私人方法名称不是一个问题。这个问题的全部意义在于它是一个意外 - 我可以将其他类的子类化,并偶然发现它的私有方法。

1 个答案:

答案 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私有方法之上。