一、刚才我们说了,属性里边没有封装对应的成员变量 1.分类中,属性内部没有封装成员变量,所以这个位置,没办法去返回值,这个位置,也没有办法去记录值, 于是,我们要想一个特殊的办法,什么特殊的办法呢,好,那我们这块儿要用到一个关联对象,这是运行时,RunTime,里面提供的内容, 所以,我们先把这个关联对象,怎么去用的,我们来演示一下,我们先新建一个项目, Name:06-关联对象 好,我把刚刚那件事情模拟一下,我在这儿,增加一个分类,分类,就是UIImageView,Name:MyView, 好,我增加这么一个分类,现在,我给分类里边去增加一个属性, @property(nonatomic,copy)NSString *urlString; 我增加这么一个属性,刚刚我们演示过了,我增加完这么一个属性,我必须去重写get和set, 好,那分类中是不能去写成员变量的,现在,我们要去存储一个值,还要去获取这个值,我们必须得想某种特殊的方案,什么特殊的方案,我们要用到运行时,这是比较底层的东西,我们先要导入一个头文件,叫做objc/runtime.h, #import < objc/runtime.h> 这是运行的时候,运行时就是,运行的时候,做的事情,在程序运行阶段,处理的事情,好,那运行时能干什么,它是对我们来说比较复杂的东西,啊, 1)// 1 可以在运行期间给某个类增加属性 以前的时候,我们给某个类写属性,是不是都在开发阶段写的,其实是编译的时候做的事情吧,编译的时候,我们就直接给这个类写上这个属性了,天生就有,那是编译的时候增加的一个属性,而我们runtime呢,我们可以在整个程序运行的时候,去做这件事情,现在我们要用到这么一个事情了,这是它可以解决的第一个问题, 2)// 2 可以在运行期间获取某个对象的所有属性名称 获取属性名称,干什么,我可以给这些属性去赋值,我可以把字典中的键,跟这个属性名称对应的这个键,它的值取出来,赋给这个属性,这块儿的话,我们将来会做的,它有什么具体的用途,其实是在做更通用的代码儿的时候,写第三方框架的时候,可以用到这么一个功能, 3)// 3 交换方法 什么是交换方法,A方法要执行一段儿代码吧,B方法要执行另一段儿代码,我们可以通过运行时,让A和B交换,就跟变性一样,哎,类似啊, 有什么用呢,比如说,将来我们要做网络开发,我们在做网络开发的时候,网速比较慢的情况下,是不是要提示一个不停旋转的那么一个东西,菊花,最上边,屏幕的电池栏旁边,会有一个不停旋转的菊花, 如果网速慢的话,这个位置,会有一个旋转的菊花,这个是怎么来的,这个是需要我们自己写代码的,虽然代码很简单,但是也是需要