如何使用@selector调用带参数的方法

时间:2010-02-19 03:50:09

标签: objective-c

我有两个名称相同但参数不同的方法:

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

现在我需要使用@selector和参数调用这些方法。怎么做?

3 个答案:

答案 0 :(得分:2)

SEL aSel = @selector(methodA:);

[objectTakesString performSelector:aSel withObject:@"A string!"]; [objectTakesNtfctn performSelector:aSel withObject:[NSNotification notificationWith...]];

答案 1 :(得分:2)

-[NSObject performSelector:withObject:]同时调用选择器和指向传递它的参数的指针。

答案 2 :(得分:1)

在我看来,前面的答案都是错误的。如果你使用

-[NSObject performSelector:withObject:];
正如Sixten Otto建议的那样,你必须把它放在方法的开头:

-(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对象确实包含有关参数类型的信息,但它是由接收对象生成的,因此您无法真正使用它来根据传递的参数类型来区分消息(因为实例化方法签名时,该信息不可用。)