delegate已被回收问题
场景:多个类之间通过delegate进行交互通信,但在某个类处理完需要交给delegate处理的时候,delegate已经被release掉了。如数据model通过ASIHTTPRequest从网络获取数据,当接受完数据需要交给model处理的时候,由于view切换等原因,model已经被release了。
解决方案
方案一
delegate指向的类使用singleton模式,确保在任何时候都由对象相应respondToSelector:。应用场景:该类占用的内存小,不会对系统内存带来巨大的压力。当然也可以让该类接受memoryWaring notification,以完成回收内存的目的。
方案二
被代理对象对代理可见,如作为成员属性,在代理内部执行delegate指向问题。常见的格式为:self.xxx.delegate = self;如果该xxx变量也可能被其他对象retain,也可以通过dealloc{self.xxx.delegate = nil}的方式确保在代理被释放的时候,被代理对象的delegate指针指向nil,从而不回导致程序crash的情况发生。应用局限:代理对象必须知道具体被代理对象。
方案三
在ios5以后的系统中可以为delegate设定weak属性,这样当对象不存在的时候delegate自动变成了nil。缺点:不支持ios4系统。