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
как способ гарантировать, что он вызывает реализацию суперкласса.