Для Objective-C … Указатель на метод
-
23-08-2019 - |
Вопрос
Я хочу настроить таблицу отправки методов, и мне интересно, возможно ли создать указатель на метод в 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];
Тип данных selector особенно полезен для потоков и таймеров, где вы можете отправить поток и предоставить ему селектор для сообщения, которое вы хотели бы, чтобы оно вызывало.Если вам нужно создать массив селекторов (или таблицу отправки) или если вам нужно вызвать селекторы с несколькими параметрами, вы можете использовать класс NSInvocation.Он предоставляет оболочку для селектора и позволяет вам указывать фактические аргументы.
Вы должны иметь в виду, что Objective-C уже основан на полностью динамической таблице отправки методов.Похоже, что поддержание указателей на функции с помощью селекторов будет отлично работать для вас, если вам просто нужна ссылка на функцию.