【问题标题】:What is the difference between following delegate method call?以下委托方法调用有什么区别?
【发布时间】:2016-09-21 14:17:47
【问题描述】:

我对这些委托方法调用感到困惑。

调用委托方法的正确方法是哪一种?

@protocol XYZDelegate <NSObject>

@required
- (void)someMethod:(id)someObject;
@end

方法一:

- (void)someButtonAction:(UIButton *)sender {

    if([self.delegate && [self.delegate respondsToSelector:@selector(someMethod:)]]) {

    [self.delegate someMethod:sender];

    }

}

方法二:

- (void)someButtonAction:(UIButton *)sender {

    if([self.delegate && [self.delegate respondsToSelector:@selector(someMethod:)]]) {

    [self.delegate performSelector:@selector(someMethod:) withObject:sender];

    }

}

【问题讨论】:

标签: ios objective-c iphone delegates


【解决方案1】:

它们几乎相同。它们将产生相同的结果。

第二个效率略低。

我要改变的是这条线......

if([self.delegate && [self.delegate respondsToSelector:@selector(someMethod:)]]) {...

协议需要方法someMethod:

所以你可以完全删除它...

- (void)someButtonAction:(UIButton *)sender {
    [self.delegate someMethod:sender];    
}

它仍然可以工作。您可以向nil 发送消息,但它不会做任何事情。如果委托不是 nil,那么根据定义,它将响应选择器。

如果委托对象不符合该方法,那么您将收到编译器错误(或者可能只是警告?)。

无论如何,这应该足够了。

作为旁注。我个人更喜欢第一种方法,如果有多个参数,那么您必须以这种方式调用它才能正确传递参数。

【讨论】:

  • 我认为这是一个编译器错误,因为我为你找到了here +1 ..
  • 您不需要检查委托属性是否为非零。在nil 上发送消息没有任何作用。
  • @Avi 啊,是的。当然。我的脑袋现在似乎完全处于 Swift 模式,哈哈! :D
【解决方案2】:

不同的是一种直接调用委托方法,而另一种使用运行时,通过performSelector,动态地这样做。

后者效率较低,没有意义,但结果是一样的。

【讨论】:

  • 我没有找到关于运行时和编译时间的地方performSelector 你能解释一下吗.. :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2011-07-16
  • 2011-10-12
  • 2011-01-14
  • 1970-01-01
相关资源
最近更新 更多