1、KVC,通过keyPath设置和读取(也可设置和读取一些未暴露的私有变量)
KVC是怎么寻找Key的
当调用setvalue: forKey时 底层调用顺序如下:
①优先调用set<key>方法 如果有该方法 在setter 方法中完成设置
②当无set方法时,kvc机制会检查
+(bool)accessInstanceVariablesDirectly;是否返回YES。当你重写了该方法并且返回的时No时 kvc机制会直接执行setValue:forUndefinedKey: 这样做可以让你的类不被别人使用kvc;
③一般情况开发者不会重写
+(bool)accessInstanceVariablesDirectly方法 所以kvc 会搜索有没有名称为<key>的成员变量。无论是在.h还是在.m部分定义也无论是使用了什么访问修饰符只要存在成员变量都可以对其成员变量进行赋值。
④如果该类中没有set,也没有_成员变量,kvc机制会搜索is<key>成员变量。
⑤如果该类还是没有 也没有_is kvc 会继续搜索<key>,is<key>再给它们赋值。
⑥如果都不存在 系统将会执行setValue:forUndefinedKey 抛出异常。
2、runtime,动态属性objc_setAssociatedObject和objc_getAssociatedObject。
// 即实现了关联传值
objc_setAssociatedObject(alert, @"btn property",sender,OBJC_ASSOCIATION_ASSIGN);
//通过 objc_getAssociatedObject获取关联对象
NSString *messageString =objc_getAssociatedObject(alertView, @"msgstr");