iOS开发笔记>> 代理模式是什么?

41 篇文章 0 订阅
10 篇文章 0 订阅

代理模式就是我们经常说的代理设计模式, 也就是代理, 这也是iOS中一种消息传递的方式, 也可以通过这种方式来传递一些参数. 


代理是一种通用的设计模式, 由代理对象, 委托者, 协议三部分组成, 有特定的语法来实现代理模式, OC语言可以通过@Protocol实现协议


1. 代理主要由3部分组成: 

协议: 用来指定代理双方可以做什么, 必须做什么

代理: 根据指定的协议, 完成委托方需要实现的功能

委托: 根据指定的协议, 指定代理去完成什么功能



2. 代理实现流程: 

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


3. 代理原理:

 通过上图我们发现, 其实委托方的代理属性本质上就是代理对象自身, 设置委托代理就是代理属性指针指向代理对象, 相当于代理对象只是在委托方中调用自己的方法, 如果方法没有实现就会导致崩溃. 从崩溃信息来看, 就可以看出是代理方没有实现协议中的方法导致的崩溃. 

而协议只是一种语法, 是声明委托方中的代理属性可以调用协议中声明的方法, 而协议中方法的实现还是由代理方完成, 而协议方和委托方都不知道代理方有没有完成, 也不需要知道怎么完成


4. 代理内存管理:

为什么设置代理属性都使用weak呢?

定义的指针默认都是__strong类型的, 而属性本质上也是一个成员变量和set, get 方法构成的, strong类型的指针会造成强引用, 必定会影响一个对象的生命周期, 这也就会形成循环引用. 


4.1. 强引用

上图中, 由于代理对象使用强引用指针, 引用创建的委托方loginVC对象, 并且成为loginVC的代理. 这会导致loginVC的delegate属性强引用代理对象, 导致循环引用的问题, 最终两个对像都无法正常释放. 

4.2. 弱引用

我们将LoginVC对象的delegate属性, 设置为弱引用属性. 这样在代理对象生命周期存在时, 可以正常为我们工作, 如果代理对象被释放, 委托方和代理对象都不会因为内存释放导致的Crash. 


4.3. 但是, 这样还有点问题, 真的不会崩溃吗?

有两种方式弱引用代理对象, weak修饰的代理属性和assign修饰的代理属性, 前者在代理对像被释放后不会导致崩溃, 而第二种会崩溃. 

weak和assign是一种"非拥有关系"的指针, 通过这两种修饰符修饰的指针变量, 都不会改变被引用对象的引用计数. 但是在一个对象被释放后, weak会自动将指针指向nil, 而assign则不会. 在iOS中, 向nil发送消息时会导致崩溃, 所以assign就会导致野指针的错误 unrecognized selector sent to instance

所以如果修饰代理属性, 还是用weak把, 比较安全!

我想如果读到这里你应该对代理不陌生了吧, 也不晕了吧.






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值