iOS - Не можете использовать "супер" в качестве ссылки?

Я пытаюсь использовать NSInvocation вызвать метод суперкласса из подкласса. Используемый код относительно прост, он выглядит так:

- (NSInvocation*) invocationWithSelector:(SEL)selector {
    NSInvocation* call = [[NSInvocation alloc] init];
    [call retainArguments];
    call.target = super;  //ERROR:  use of undeclared identifier 'super'

    call.selector = @selector(selector);

    return call;
}

Это кажется мне немного странным, так как я всегда предполагал, что super следовал в основном тем же правилам, что и self (то есть его можно рассматривать как прямую ссылку на рассматриваемый объект и присваивать переменным, использовать как возвращаемое значение и т. д.). Похоже, что это не так на практике.

Во всяком случае, есть ли простой способ получить мой NSInvocation нацелить реализацию суперкласса (я не могу использовать self как цель, потому что подкласс переопределяет методы суперкласса), или мне нужно искать какой-то другой подход?

2 ответа

Решение

Смотрите, что именно супер в Objective-C? для получения дополнительной информации, но супер на самом деле не является объектом. Super - это ключевое слово для компилятора для генерации вызовов времени выполнения obj-c (в частности, objc_msgSendSuper). По сути, это похоже на приведение вашего класса к его суперклассу перед отправкой ему сообщения.

РЕДАКТИРОВАТЬ Итак, если вы переопределили метод, который хотите вызвать, вам нужно будет написать другой метод для непосредственного вызова [super method] и настроить вызов для вызова этого метода. Среда выполнения будет отправлять сообщения только объектам, и они будут обрабатываться на самом низком элементе цепочки наследования, который их реализует.

super а также self один и тот же объект, так что просто используйте

call.target = self;

Разница между ними в том, что вы можете использовать super как получатель сообщения self как способ гарантировать, что он вызывает реализацию суперкласса.

Другие вопросы по тегам