类添加属性的方法

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");

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iO...
    我的梦工厂阅读 906评论 1 8
  • KVC KVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过K...
    暮年古稀ZC阅读 2,208评论 2 9
  • 源码加翻译 #import <Foundation/NSArray.h> #import <Foundation/...
    CAICAI0阅读 1,188评论 0 50
  • KVC(Key-valuecoding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iOS...
    榕樹頭阅读 738评论 0 2
  • 炙热的天气。 太阳光落在我的书桌前,空气是有温度的,就像热水沸腾时不断上升的水汽。此刻,我的心情就和这令人烦躁的天...
    守望者w阅读 170评论 0 1