2016-09-21 82 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

相關問題