Для Objective-C... Указатель на метод
Я хочу настроить таблицу отправки методов, и мне интересно, можно ли создать указатель на метод в Objective-C (например, указатель на функцию в C). Я попытался использовать некоторые функции времени выполнения Objective-C для динамического переключения методов, но проблема в том, что это повлияет на все экземпляры.
Поскольку я очень новичок в Objective-C, иллюстрированный пример будет высоко оценен.
Objective-C методы называются selector
s и представлены типом SEL
. Если ваш объект наследуется от NSObject
, вы можете сказать ему выполнить селектор (т.е. Вызвать метод), например:
SEL selector = @selector(doSomething:);
[obj performSelector:selector withObject:argument];
Это предполагает, что у вас есть определенный метод:
-(void)doSomething:(MyObject*)arg;
Селекторы назначаются SEL
типам данных через ключевое слово @selector
, которое берет имя метода, который вы хотите сохранить. Имя метода - это имя метода, лишенное всех аргументов. Например:
-(void)doSomething:(MyObject*)arg withParams:(MyParams*)params
Будет называться @selector(doSomething:withParams:)
.
Да! В Objective-C указатели на функции называются селекторами. Если у вас есть метод, определенный следующим образом:
- (void)myFunctionWithObject:(NSObject*)obj otherObject:(NSNumber*)obj2
{
}
Селектор объявляется следующим образом:
@selector(myFunctionWithObject:otherObject:)
Чтобы выполнить селектор объекта, вы можете использовать:
[object performSelector:@selector(myFunction)];
или
[object performSelector:@selector(myFunctionTakingParameter:) withObject: o];
Тип данных селектора особенно полезен для потоков и таймеров, где вы можете отправить поток и предоставить ему селектор для сообщения, которое вы хотите вызвать. Если вам нужно создать массив селекторов (или таблицу рассылки) или вам нужно вызвать селектор с несколькими параметрами, вы можете использовать класс NSInvocation. Он предоставляет оболочку для селектора и позволяет вам указывать фактические аргументы.
Вы должны помнить, что Objective-C уже основан на таблице динамической рассылки динамических методов. Похоже, что сохранение указателей функций с помощью селекторов будет работать отлично для вас, если вам просто нужна ссылка на функцию.