理解授权和协议之间的关系

时间:2015-02-13 12:49:41

标签: ios objective-c swift delegates protocols

我知道这里有很多类似的问题,但我仍然需要对这个概念作一些澄清。

首先让我先说我确实了解协议是什么以及如何使用它们,我理解的问题是委托。我确实知道委托就是当一个程序中的一个对象代表另一个对象时,听起来很简单但很难看到整个画面。

1-委托是一种让编译器知道在哪里查找将操纵对象的代码(UITableView等)的方法吗?

2-委托和协议是否一起工作?

3-如果没有协议,委托是否存在?如果是的话,你能告诉我一个例子。

4-当我们声明一个协议并且一个类符合它时,我们可以说这个符合协议的类是委托协议的行为吗?

上述情况有多少?

非常感谢

2 个答案:

答案 0 :(得分:3)

  

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 :(得分:1)

  1. 委派允许对象能够根据应用程序其他部分的更改来更改其外观/状态。设置一个 对象上的delegate属性将允许编译器执行某些操作 在构建时检查。

  2. 通常使用协议来实现委托,因为它允许使用协议 委托对象为任何类而不是类的子类 有特定的行为。

  3. 是的,但这会导致您的课程紧密耦合,因为Foo需要了解Bar,反之亦然。使用协议允许您使用任何类,因此id属性,从而导致系统松散耦合。

  4. 示例:

    @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. 当一个类符合协议时,该类被迫采用该协议的行为(实现这些方法)。如果代表另一个类执行某项任务,它只会成为委托,例如提供表格中的行数。