一般来说, 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.
由于笔者知识有限,如有错误,欢迎讨论指出。