Создание селектора из имени метода с параметрами
у меня есть пример кода, который получает SEL
из текущего объекта,
SEL callback = @selector(mymethod:parameter2);
и у меня есть способ, как
-(void)mymethod:(id)v1 parameter2;(NSString*)v2 {
}
теперь мне нужно двигаться mymethod
к другому объекту, скажем myDelegate
.
Я пробовал:
SEL callback = @selector(myDelegate, mymethod:parameter2);
но он не будет компилироваться.
3 ответа:
SEL-это тип, который представляет селектор в Objective-C. ключевое слово @selector () возвращает SEL, который вы описываете. Это не указатель на функцию, и вы не можете передать ему какие-либо объекты или ссылки любого рода. Для каждой переменной в селекторе (методе) вы должны представить это в вызове @selector. Например:
-(void)methodWithNoParameters; SEL noParameterSelector = @selector(methodWithNoParameters); -(void)methodWithOneParameter:(id)parameter; SEL oneParameterSelector = @selector(methodWithOneParameter:); // notice the colon here -(void)methodWIthTwoParameters:(id)parameterOne and:(id)parameterTwo; SEL twoParameterSelector = @selector(methodWithTwoParameters:and:); // notice the parameter names are omitted
селекторы обычно передаются для делегирования методов и обратных вызовов, чтобы указать, какой метод должен быть вызван для конкретного объекта во время обратного вызова. Например, при создании таймера метод обратного вызова определяется следующим образом:
-(void)someMethod:(NSTimer*)timer;
поэтому при планировании таймера вы должны использовать @selector, чтобы указать, какой метод на вашем объекте будет фактически отвечать за обратный вызов:
@implementation MyObject -(void)myTimerCallback:(NSTimer*)timer { // do some computations if( timerShouldEnd ) { [timer invalidate]; } } @end // ... int main(int argc, const char **argv) { // do setup stuff MyObject* obj = [[MyObject alloc] init]; SEL mySelector = @selector(myTimerCallback:); [NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES]; // do some tear-down return 0; }
в этом случае вы указываете, что объект obj будет отправляться с myTimerCallback каждые 30 секунд.
вы не можете передать параметр в @selector().
похоже, вы пытаетесь реализовать обратный вызов. Лучший способ сделать это будет что-то вроде этого:
[object setCallbackObject:self withSelector:@selector(myMethod:)];
затем в объекте setCallbackObject: withSelector: method: вы можете вызвать свой метод обратного вызова.
-(void)setCallbackObject:(id)anObject withSelector:(SEL)selector { [anObject performSelector:selector]; }
помимо того, что уже было сказано о селекторах, вы можете посмотреть на класс NSInvocation.
NSInvocation-это сообщение Objective-C, оказанное статическим, то есть это действие, превращенное в объект. Объекты NSInvocation используются для хранения и пересылки сообщений между объектами и между приложениями, в первую очередь объектами NSTimer и системой распределенных объектов.
объект NSInvocation содержит все элементы сообщения Objective-C: цель, селектор, Аргументы и возвращаемое значение. Каждый из этих элементов может быть установлен непосредственно, и возвращаемое значение устанавливается автоматически при отправке объекта NSInvocation.
имейте в виду, что, хотя это полезно в определенных ситуациях, вы не используете NSInvocation в обычный день кодирования. Если вы просто пытаетесь заставить два объекта разговаривать друг с другом, рассмотрите возможность определения неформального или формального протокола делегирования, или передача селектора и целевого объекта, как уже упоминалось.