Ограничить вызов метода определенной областью видимости в Objective-C - PullRequest
4 голосов
/ 19 мая 2011

Проблема в том, что мой "приватный" метод (_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 Ответ

3 голосов
/ 19 мая 2011

Одно из решений состоит в том, чтобы не использовать [] для отправки сообщения, вместо этого используйте 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 оставляет за собой это соглашение . В противном случае вы можете непреднамеренно переопределить закрытый метод Apple.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...