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系统。

posted on 2013-09-27 16:58  小朝  阅读(278)  评论(0编辑  收藏  举报