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