我有两个名称相同但参数不同的方法:
-(void)methodA:(NSString*)string
-(void)methodA:(NSNotification*)notification
现在我需要使用@selector和参数调用这些方法。怎么做?
答案 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
对象确实包含有关参数类型的信息,但它是由接收对象生成的,因此您无法真正使用它来根据传递的参数类型来区分消息(因为实例化方法签名时,该信息不可用。)