利用runtime实现延展动态改变模型类中属性的set,get方法
昨天大概的阐述了一下关于构架控制容器的概念,但是如果要丰满这个想法还有很多问题,比如如果我想对一些controller进行管理就势必涉及到controller的加载以及缓存,而想做这些的前提就是构建一个controller表。对表中设定的字符串管理,从而管理对应的controller。传统创建表的方法有很多,最为常用的就是plist文件,但是对于iOS开发的程序员来说,如果这个plist写死,在管理的时候就会比较死板,要知道oc是一门灵活的,动态的语言。如果我们使用NSUserDefaults,观察起来又不是很方便。所以今天我要分享的是,利用类目实现类目动态改变模型类中属性的set,get方法。
为什么使用类目?因为类目使用起来更加方便,我们不用特别限制哪一个属性,而且可移植性比较高。而使用runtime,我们再也不用恶心的一个一个修改set和get方法了,我们只需要很少的代码就可以实习方法改写。好了,闲话少说,上代码。
我们先创建一个指向它本身的对象,然后copy它的全部属性。
接下来我们开始遍历所有属性,并从新改写他的set,get方法。随便提一嘴IMP,这个东西对刚接触iOS开发的应该会很陌生,其实它是一个函数指针,在api文档中是这么定义它的typedef id (*IMP)(id, SEL, );而IMP可以从 对象 & SEL的方法得到。如果想深入了解IMP的话,可以看一下message机制,在这里我就不多说了。这里面Setter,Getter是怎么实现的呢?
我们看到,这两个函数都具备两个参数,一个是id类型的obj,另一个是SEL类型的_cmdMe,其实这两个参数的参数名是可以随便写的,这里面我这么写,主要是方便理解。这里面就是我们动态添加的set,get方法,如果我们想有更多的操作,都可以在这两个方法里面去写。
最后我们使用一下我们写的这个类目。首先我们随便创建一个model,当然必须继承NSObejct。
这里面我创建的model名称为ViewControllerName,当然我觉得叫ViewControllerNameList更为贴切,很显然我是为了之后做缓存列表而构建的,我们在写项目的时候最好多注意一下命名规范。那这个时候它应该调用我们刚刚写的set方法了。
我们运行之后打印沙盒文件发现,它已经存在我们本地的plist文件里了。这样写我们可以通过model看到我们一共做管理那些controller,为之后的缓存列表做好准备。而使用get方法就和我们平时使用起来一样,这里我就不多做介绍了。如果有什么问题,可以及时反馈给我,谢谢!