2016-09-21 71 views
0

我对这些委托方法调用感到困惑。下面的委托方法调用有什么区别?

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

@protocol XYZDelegate <NSObject> 

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

方法1:

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

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

    [self.delegate someMethod:sender]; 

    } 

} 

方法2:

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

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

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

    } 

} 
+0

格式。请。 – Avi

+0

CMD K是如何修复格式。不是空格键或删除按钮。 – Fogmeister

+0

@Fogmeister,感谢格式化提示 – HPM

回答

0

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

后者效率较低且毫无意义,但结果相同。

+1

无处我找到关于运行时和编译时'performSelector'你能解释多一点.. :) – vaibhav

1

他们都差不多。它们会导致相同的结果。

第二个效率稍低。

我会改变的是行...

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

方法someMethod:由协议要求。

所以,你可以将其彻底删除...

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

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

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

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

就像一个侧面说明。我个人比较喜欢第一种方法,如果有多个参数,那么你必须以这种方式调用它,以便能够正确传递参数。

+1

我认为它的编译器错误,因为我发现[这里](https://developer.apple.com/reference/objectivec/1418956-nsobject/1418764-performselector)+1。 – vaibhav

+0

您不需要检查委托属性是否为非零。在'nil'上发送消息什么也不做。 – Avi

+0

@Avi啊,是的。当然。我的脑袋现在似乎完全处于Swift模式,哈哈! :D – Fogmeister

相关问题