iOS中的强代理(strong delegate)
一般来说, iOS中的代理都是weak类型的, 这是因为一般代理者都是代理持有者的父对象, 而父对象会持有代理持有者. 因此, 如果代理是强类型, 则会导致循环引用. 虽说代理者不一定得是代理持有者的父对象, 但是这是最常见的使用场合, 用于子对象向父对象传递数据.
比如一个UIViewController是一个View的delegate, 在View上的某些操作需要传递给UIViewController, 从而UIViewController做出某些响应.
另一种情况, (父对象)并不需要持有代理持有者, 只是需要在某些操作时做出响应, 而这些响应并不需要(父对象)持有代理持有者, 但是需要代理持有者维持一定的什么周期. 比如一些连接网络的操作. 这时就不会出现循环引用的情况.
到底是使用strong delegate还是weak delegate, 归根结底由调用者(父对象)决定, 调用者是否需要持有代理持有者. 但是话说回来, delegate的weak(strong)属性需要在声明时就指定. 要是遇到有时需要strong delegate有时需要weak delegate时怎么办呢? 这时我们就需要用到另一种回调方式block.
在block中, 当可能引起循环引用时, 不直接持有父对象, 即self对象, 而是使用self对象的弱引用,比如使用__weak typeof(self) weakSelf = self;
然后在block内部用weakSelf代替self.
在iOS中存在一类strong类型的delegate, 比如CoreAnimation的代理和NSURLSession的代理. 使用强代理是因为动画和网络请求在异步执行, 而异步执行中随时可能会丢失销毁对象, 当执行完成之后再手动销毁对象. 因此要使用strong delegate, 必须当任务完完成时在将delegate=nil来释放delegate.
由于笔者知识有限,如有错误,欢迎讨论指出。