簡體   English   中英

了解委托與協議之間的關系

[英]Understanding the Relation Between Delegation and Protocols

我知道這里有很多類似的問題,但是我仍然需要對此概念進行一些澄清。

首先,讓我首先說我確實了解什么是協議以及如何使用它們,我所遇到的問題是委派。 我確實理解委托是指程序中的一個對象代表另一個對象時,聽起來很簡單,但是很難看清整個畫面。

1-委托只是一種讓編譯器知道在哪里查找將要操作該對象的代碼的方法(UITableView等)嗎?

2-委托和協議可以一起工作嗎?

3-沒有協議就可以存在委派嗎? 如果是,請給我一個例子。

4-當我們聲明一個協議並且一個類符合它時,我們可以說這個符合協議的類是委派協議行為的嗎?

以上多少是正確的?

非常感謝

1-委托只是一種讓編譯器知道在哪里查找將要操作該對象的代碼的方法(UITableView等)嗎?

不,委托是一種設計模式。 這只是一個概念。

2-委托和協議可以一起工作嗎?

是的,他們在一起工作很好,對您的代表使用協議可能是最佳實踐。

3-沒有協議就可以存在委派嗎? 如果是,請給我一個例子。

是的你可以。 委托概念只是為了刪除對象的知識並將其放入委托中。 例如,一個UITableView不知道它有多少行,或者當單擊一個單元格時不知道該怎么做,因此它詢問其委托。 但是委托仍然是另一個對象。

如果實現特定協議會更好,但是您可以不使用它。

舉個例子 :

我有一個MyView,它是MyCustomViewController的子視圖。

MyCustomViewController.h

- (void)myViewIsTouched;

MyView.h

@property (nonatomic, weak) MyCustomViewController *delegate

MyView.m

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.delegate myViewIsTouched];
}

此示例中沒有協議,但它仍然是委托。 (更好的方法仍然是使用協議,而不是在.h中聲明方法)

4-當我們聲明一個協議並且一個類符合它時,我們可以說這個符合協議的類是委派協議行為的嗎?

我不知道在說什么。 但是協議和委托不是同一回事。 實現協議的對象並不意味着它是委托。

  1. 委托使對象能夠根據應用程序其他部分的更改來更改其外觀/狀態。 在對象上設置delegate屬性將允許編譯器在構建時進行一些檢查。

  2. 委托通常通過使用協議來實現,因為它允許委托對象屬於任何類,而不是具有特定行為的類的子類。

  3. 是的,但是這會導致您的班級緊密耦合,因為Foo需要了解Bar ,反之亦然。 使用協議允許您使用任何類,因此可以使用id屬性,從而導致系統松耦合。

例:

@class Foo;
@interface Bar : NSObject
- (void)respondToSomeAction:(Foo *)obj;
@end

@implementation Bar 
- (void)respondToSomeAction:(Foo *)obj {
   NSLog("responding to %@",obj);
}
@end

@interface Foo : NSObject 
@property (nonatomic, weak) Bar *delegate
@end

@implementation Foo
- (void)someActionTriggered {
    [self.delegate respondToSomeAction:self]
}
@end
  1. 當一個類符合協議時,該類被迫采用協議的行為(實現方法)。 它僅在被賦予代表另一類的某些任務時才成為委托 ,例如,提供表中的行數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM