objc-runtime 的应用:EasyPrefs

 

Objective-CRuntime可以说是Objective-C这门语言的基石,也是最神奇而又有魅...



Objective-C Runtime 可以说是 Objective-C 这门语言的基石,也是最神奇而又有魅力的瑰宝。关于 Runtime 的讨论和实现可以说是源源不断,今天我写的一个小封装也是基于 Runtime。

# 事情的起因 #

整个事情要从应用设置项说起,像是下面这种东西:



众所周知,Cocoa 提供了 NSUserDefaults 这个类,它让你不管在 iOS 还是 Mac 上面都能够轻松的存取一些轻量的配置项。并且它提供了一些相对方便的接口,用于存取不同的数据类型。像上面这个面板,最佳的存储地点应该就是 NSUserDefaults。

# NSUserDefaults 的局限性 #

1. 出现过多的 key

NSUserDefaults 的接口普遍都是setObject:forKey: 的形式,为了更好的管理通常会将 key 定义成一个字符串常量,同时你可能会写一个这个 key 对应的 setter 和 getter,一旦多了起来的话,将会非常难看,而且配置成本较高。

2. 仅支持 property-list 的数据类型

众所周知的是,NSUserDefaults 仅仅支持以下几种对象:NSArray | NSDictionary | NSString | NSNumber | NSDate | NSURL | NSData,对于其他的对象,哪怕是一个 UIColor,你也要把它序列化成 NSData,才能往里面存。

3. 默认值不好配置

对于一个配置项我们常常会依赖他的默认值,如果一个 BOOL 默认需要是 YES 的话,你就必须使用 registerDefaults 方法进行配置,这是并不方便的。

所以说随着项目里面的配置项越来越多,我开始在想怎么样优化这个问题,最后我决定要实现这么一个配置工具,它具有如下特性:

  • 定义 property 即可生成相应的选项
  • 直接使用 property 即可完成存取
  • 不再需要 key,key 可以自动生成
  • 可以方便的给某一个 property 配置默认值
  • 可以方便的给某一个 property 配置特殊的 key
# 属性枚举 #

属性的枚举在 Objective-C 里面非常的简单,用下面的代码就能动态的拿到一个对象全部的属性名字

[code]uint count;
objc_property_t *properties = class_copyPropertyList(self.class, &count);
for (int i=0; i


    关注 可可笔记


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册