Я бы сказал, что это немного сложнее , чем могли бы предположить ответы предыдущих респондентов ... если вы действительно действительно хотите создать селектор ... не просто "позвони одному", которого ты "лежишь" ...
Вам нужно создать указатель на функцию, который будет вызываться вашим "новым" методом ... поэтому для метода, подобного [self theMethod:(id)methodArg];
, вы должны написать ...
void (^impBlock)(id,id) = ^(id _self, id methodArg) {
[_self doSomethingWith:methodArg];
};
и затем вам нужно сгенерировать блок IMP
динамически, на этот раз, передавая "self", SEL
и любые аргументы ...
void(*impFunct)(id, SEL, id) = (void*) imp_implementationWithBlock(impBlock);
и добавьте его в свой класс вместе с точной сигнатурой метода для всей присоски (в данном случае "v@:@"
, возврат void, вызывающий объект, аргумент объекта)
class_addMethod(self.class, @selector(theMethod:), (IMP)impFunct, "v@:@");
Вы можете увидеть некоторые хорошие примеры такого рода shenanigans во время выполнения , в одном из моих репозиториев, здесь.