我正在尝试解析ObjC中委托和超类之间的区别。
docs say I should使用SuperClass
if( [MySuperclass instancesRespondToSelector:@selector(aMethod)] ) {
// invoke the inherited method
[super aMethod];
}
我正在将以下Apple提供的源代码迁移到Xamarin / Monotouch
- (IBAction)closeButtonAction:(id)sender
{
id <TapViewControllerDelegate> strongDelegate;
#pragma unused(sender)
strongDelegate = self.delegate;
if ([strongDelegate respondsToSelector:@selector(tapViewControllerDidClose:)]) {
[strongDelegate tapViewControllerDidClose:self];
}
}
问题
这两种方法有什么区别?
如果可能,您能告诉我如何在C#/ Xamarin中实施吗?
答案 0 :(得分:0)
- respondsToSelector:
测试接收对象是否会响应特定的选择器。+ instancesRespondToSelector:
测试接收类的实例是否会响应特定的选择器super
有点不同。它会更改起点以搜索在调用中实现选择器的方法。 搜索通常从self
引用的对象的类开始,然后继续到self
等引用的对象的类的超类。使用super
启动搜索在包含super
调用的方法的类的超类中。此不需要与self
引用的对象的超类相同。有关详细信息,请参阅this answer。
仍在self
上调用找到的方法。
鉴于此,致电[obj respondsToSelector:someSelector]
与致电[[obj class] instancesRespondToSelector:someSelector]
相同。
类值本身就是一个对象,并且为了测试给定的类是否响应类选择器(+ methodName
),您可以向其发送respondsToSelector:
,例如[[obj class] respondsToSelector:someClassSelector]
。
首先举例来说:
[MySuperclass instancesRespondToSelector:@selector(aMethod)]
其中MySuperClass
是类名。这将确定定义包含此语句的方法的类的超类的实例是否将响应选择器。这决定了呼叫[super @selector(aMethod)]
是否安全。
正如您引用的documentation所述,不与调用[super respondsToSelector:@selector(aMethod)]
相同,因为它会检查与self
相同类型的对象(和请记住,定义方法的类不需要与对象self
是同一个类,例如,如果类A
是类B
的子类,并且{{ 1}}定义方法B
然后可以使用引用M
或M
实例的self
值调用A
。如果您不确定B
的含义,请参阅上面引用的same answer。
你的第二个例子是:
super
这里[strongDelegate respondsToSelector:@selector(tapViewControllerDidClose:)]
是一个引用某个类的实例的变量。此调用确定该实例是否响应给定的选择器,因此调用strongDelegate
是否安全。
HTH