OC运行时简单运用(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WangErice/article/details/50728668

    作为iOS 开发人员,几乎所有人都或多或少听过说OC很牛逼的一个机制-运行时机制,然而对于很对人来讲在实际的开发过程中用到运行时使用场景貌似并不是很多,原因很多,比如运行时几乎是纯C的底层API,对于很多没有C语言基础的开发者来说阅读和使用并不顺畅,或者项目中使用到的技术并不经常涉及这方面的应用。其实,很多运行时的机制在日常的开发过程中,如果应用得当,会给你的开发过程带来很多意想不到的便利和收获,现在就让我们来看几个运行时机制的简单运用。

获取一个类中属性

在很多的开发场景中我们,我们迫切想要知道一个类(尤其是系统类和第三方的类库中那些我们并没有源代码的类)中所包含的属性到底有哪些,以便于获取未知的属性来进行操作。

运行时中提供了获取类属性的两个函数class_copyPropertyListclass_copyIvarList,这两个函数的区别在于,第一个方法只能获取到通过@property声明的属性,而后一个函数可以获取所有属性(包括@property声明的和大括号中声明的)。

为了使该方法具有普遍性,我们通过给NSObject添加分类(Category),加入获取类属性的方法。


这样我们就获取到了一个类中的所有属性变量。那获取到之后,在我们的开发中可以有哪些实际的运用呢?

1. 改变私有属性表现行为

比如我们想要改变UITextField中右侧清除按钮的样式,可是UITextField类并没有提供相关的属性接口,那么我们还如何获取该控件呢?我们通过上述的方法可以查看到UITextField的所有属性变量名称,然后就可以通过KVC获取对应的属性进行操作。比如获取以下UITextField的相关的属性,得到如下结果:


果然,我们在UITextField的属性发现了_clearButton这个我们比较关心的属性,接下来怎么办呢,当然是获取该属性对应的控件,于是KVC神器就该发挥作用了。


通过获取_clearButton并修改其中的重新设置其中的image,我们就可以间接修改系统的控件,通过不重写子类的方法快速定制我们想要的效果。

2.通过间接手段改变私有属性的值
在有些时候我们需要通过KVC去修改某个类的私有变量,但是又不知道该属性是否存在,如果类中不存在该属性,那么通过KVC赋值就会crash,这时也可以通过运行时进行判断。同样我们在NSObject的分类中增加如下方法。

我们通过该方法即可以询问类中是否存在该属性,如果存在,则可以通过KVC进行修改,这样就不就崩溃了。

然后就可过KVC进行修改了,

3.简化重复的代码书写
3.1 在一些使用场景中,我们常常需要将获取到的数据转化为对应model便于操作和使用。但是如果属性太多,写起来就会比较麻烦,这时候我们就可以利用这一属性来简化赋值过程,完成原始数据与model转化。
3.2 在另外的一些使用场景中,我们需要对自定义对象进行归档处理,如果自定义对象的属性比较多,我们也会因为重复的书写浪时间,而且看起来也不美观,这时候上边的方法就又可以发挥作用了。



猜你喜欢

转载自blog.csdn.net/WangErice/article/details/50728668