delegate 是与subclass 实现扩展的另一种方式。
一个subclass类的行为在其编译时候就确定下来了。
但有些时候,希望一个类的行为在不同情况下(用户交互,不同状态时),是runtime flexibility的。这时候选择delegate更加合适。
例如NSWindow,在某些情况下,希望“关闭-close”能执行不同的处理。(可能是,保存,刷新另一个界面等等)。
代理通常要实现一个Protocol,所以它们能够响应这个“情况”。
但是各个代理应该有自己响应的方式,所以当NSWindow的delegate 被赋值到不同的delegate上时,它就可以有不同的功能,
这就是 runtime 灵活性了。
更多的变化:
· 一个delegate 可以为多个object服务
· 一个delegate可以实现 all, some 或者 none 的protocol接口。
· object在运行时还可以换delegate (但是不能换继承,对吧)
习惯用法:
·为了最大的通用,一般声明为id类型 -(id)delegate. property (assign) 就可以了,不要retain.
(另一个理由是,delegate是nil的话并不影响object 的工作,所以被代理方并不需要持有delegate )
如果delegate 是nil,对象应该以默认的方式执行。
·delegate 的接口方法一般以这些词开头: should,will,did
·