代理模式

代理模式是什么?

代理模式是一种常用的设计模式,提供了一种消息传递的方式,还可以传递参数。

代理模式的原理?

在iOS中代理的本质就是代理对象内存的传递和操作,我们在委托类设置代理对象后,实际上只是用一个id类型的指针将代理对象进行了一个弱引用。委托方让代理方执行操作,实际上是在委托类中向这个id类型指针指向的对象发送消息,而这个id类型指针指向的对象,就是代理对象。

代理模式的内存管理

我们通常使用weak来修饰代理,那么,可不可以使用strong呢,我们想一下,在控制器中对委托类的对象有一个强引用,如果使用strong修饰代理,委托类对象设置控制器为自己的代理后,对控制器有了一个强引用,这就导致了双方无法释放,形成强引用,所以,使用一个弱引用来修饰代理就可以避免这个问题,可能你又想问了,asign也表示一种”非拥有关系“,是不是可以用它来修饰代理呢?回答这个问题前我们可以先思考两个问题:

  1. asign和weak的的使用场景
    asign和weak都表示一种“非拥有关系”指针,不会使被修饰变量的引用计数改变,asign通常用来修饰基本数据类型,weak用来修饰对象,是一种弱引用,能够防止循环引用,也可以用来修饰代理,IB控件也可以使用weak(其实strong也可以啦,后面介绍)
  2. asign和weak的区别是什么?
    weak修饰的对象,在引用计数为0 ,被释放后会被置为nil,OC中向一个nil发送消息是不会崩溃的,而使用asign修饰的话,释放后不会被置为nil,这时候如果向这个对象发送消息,就会崩溃,野指针错误unrecognized selector sent to instance
    所以我们应该尽量将代理设置为weak型,安全嘛。
代理模式包含三部分:
  • 委托类(委托类可以制定协议,规定代理完成的功能)
  • 协议(方法列表,指定了委托方需要代理完成的功能)
  • 代理类(遵守协议,完成委托方指派的内容)

为什么用代理模式?

代理模式什么时候用?

代理模式优缺点

原文地址:http://www.jianshu.com/p/2113ffe54b30

你可能感兴趣的:(代理模式)