Не совсем - они выглядят так:
id method(id, SEL, ...);
Таким образом, метод Objective-C (будь то метод класса или экземпляра) предполагает получение экземпляра класса, к которому он вызывается (который будет метаклассом в случае метода класса), и селектора, который его вызвал .
Этот тип определяется как 'IMP' в objc.h:
typedef id (*IMP)(id, SEL, ...);
Вы можете получить указатель IMP либо с помощью функции C class_getMethodImplementation , либо с помощью + instanceMethodForSelector: (или -methodForSelector: , если хотите чтобы позволить конкретному экземпляру, возможно, перестроить его методы во время выполнения) метод на все, что происходит от NSObject.
Так, например,
#import <objc/objc.h>
id someObject = ...something...;
IMP functionPointerToMethod = [someObject methodForSelector:@selector(method)];
functionPointerToMethod(someObject, @selector(method));
Или:
IMP functionPointerToMethod = [someObject methodForSelector:@selector(method:)];
functionPointerToMethod(someObject, @selector(method:), argument);
Или даже:
IMP functionPointerToMethod = class_getMethodImplementation([someObject class],
@selector(method:));
functionPointerToMethod(someObject, @selector(method:), argument);
Конечно, во всем этом вы удаляете обычную динамическую диспетчеризацию Objective-C из цикла. Поэтому, если вы впоследствии добавите или перегруппируете методы в классе, указатель на вашу функцию C устареет.
Методы класса доступны практически теми же средствами, но через метакласс, например,
// to do the same as [NSString alloc], not that you ever would...
IMP functionPointerToAlloc = [[NSString class] methodForSelector:@selector(alloc)];
functionPointerToMethod([NSString class], @selector(alloc));