Как вызвать метод с параметрами, используя @selector - PullRequest
2 голосов
/ 19 февраля 2010

У меня есть два метода с одинаковым именем, но разные параметры говорят:

-(void)methodA:(NSString*)string
-(void)methodA:(NSNotification*)notification

Теперь мне нужно вызвать эти методы, используя @selector с параметрами.Как это сделать?

Ответы [ 3 ]

2 голосов
/ 19 февраля 2010

-[NSObject performSelector:withObject:] принимает как вызываемый селектор, так и указатель на параметр для его передачи.

2 голосов
/ 19 февраля 2010

<code>SEL aSel = @selector(methodA:);</p>

<p>[objectTakesString performSelector:aSel withObject:@"A string!"];
[objectTakesNtfctn performSelector:aSel withObject:[NSNotification notificationWith...]];
1 голос
/ 19 февраля 2010

На мой взгляд, оба предыдущих ответа неверны.Если вы используете

-[NSObject performSelector:withObject:];

, как предлагает Сикстен Отто, вы должны поместить это в начало вашего метода:

-(void)methodA:(id)stringOrNotification
{
   if ([stringOrNotification isKindOfClass:[NSString class])
   {
      ..do something..
   }
   if ([stringOrNotification isKindOfClass:[NSNotification class])
   {
      ..do something else..
   }
   . . .
}

Помимо этого (плохого) подхода, что вы 'Запрашиваемая информация на самом деле (легко) не может быть выполнена в Objective-C, потому что язык не поддерживает параметрический полиморфизм.Другими словами, информация о типе не используется в отправке сообщения.Еще один способ сказать, что в одном классе не может быть «двух методов с одинаковым именем, но разными параметрами».На самом деле, я удивлен, что вы еще не видели ошибку компилятора, если пытались объявить это.

(Если у вас есть два метода, определенных в разных классах ,как и предполагает dreamlax, вызов сообщения будет работать тривиально, даже если вы не используете performSelector:. Примерно так:

id eitherStringOrNotification;
[objectOfUncertainClass methodA:eitherStringOrNotification];

Если это то, что вы просите, у вас нетпроблема.)

Обратите внимание, что объект NSMethodSignature содержит информацию о типах параметров, но она генерируется принимающим объектом, поэтому вы не можете использовать ее для разграничения сообщений на основе того, какие типы параметровпередаются (поскольку эта информация недоступна, когда создается экземпляр сигнатуры метода).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...