作为iOS 开发人员,几乎所有人都或多或少听过说OC很牛逼的一个机制-运行时机制,然而对于很对人来讲在实际的开发过程中用到运行时使用场景貌似并不是很多,原因很多,比如运行时几乎是纯C的底层API,对于很多没有C语言基础的开发者来说阅读和使用并不顺畅,或者项目中使用到的技术并不经常涉及这方面的应用。其实,很多运行时的机制在日常的开发过程中,如果应用得当,会给你的开发过程带来很多意想不到的便利和收获,现在就让我们来看几个运行时机制的简单运用。
获取一个类中属性
在很多的开发场景中我们,我们迫切想要知道一个类(尤其是系统类和第三方的类库中那些我们并没有源代码的类)中所包含的属性到底有哪些,以便于获取未知的属性来进行操作。
运行时中提供了获取类属性的两个函数class_copyPropertyList与class_copyIvarList,这两个函数的区别在于,第一个方法只能获取到通过@property声明的属性,而后一个函数可以获取所有属性(包括@property声明的和大括号中声明的)。
为了使该方法具有普遍性,我们通过给NSObject添加分类(Category),加入获取类属性的方法。
这样我们就获取到了一个类中的所有属性变量。那获取到之后,在我们的开发中可以有哪些实际的运用呢?
1. 改变私有属性表现行为
比如我们想要改变UITextField中右侧清除按钮的样式,可是UITextField类并没有提供相关的属性接口,那么我们还如何获取该控件呢?我们通过上述的方法可以查看到UITextField的所有属性变量名称,然后就可以通过KVC获取对应的属性进行操作。比如获取以下UITextField的相关的属性,得到如下结果:
果然,我们在UITextField的属性发现了_clearButton这个我们比较关心的属性,接下来怎么办呢,当然是获取该属性对应的控件,于是KVC神器就该发挥作用了。
![](https://i-blog.csdnimg.cn/blog_migrate/a4742cfe3d97325c15bb2e71966e4076.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fdf1ea84b67856bcdef007848f8fedaf.png)
![](https://i-blog.csdnimg.cn/blog_migrate/11fbbd9e0ac03bb4a09ec9da592c3160.png)
![](https://i-blog.csdnimg.cn/blog_migrate/41c31f85c5a4e6bb8cfe0c6f8e87d343.png)