在delegate vs Superclass上使用respondsToSelector

时间:2017-07-09 18:50:14

标签: c# ios objective-c xamarin.ios

我正在尝试解析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中实施吗?

1 个答案:

答案 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然后可以使用引用MM实例的self值调用A。如果您不确定B的含义,请参阅上面引用的same answer

你的第二个例子是:

super

这里[strongDelegate respondsToSelector:@selector(tapViewControllerDidClose:)] 是一个引用某个类的实例的变量。此调用确定该实例是否响应给定的选择器,因此调用strongDelegate是否安全。

HTH