这些知识是UI初级学习的,目前我还在学习中,适合初学者看
KVC—Key Value Coding 也就是键值编码 是一种获取值和设置值的方式
当我们创建一个类文件,为这个类设置成员属性的时候:
创建一个“人”类:有名字(name), 年龄(age)两个公有的成员属性:
因为使用@property关键字,会在HFPerson.m中,直接生成setter(设置值) 、getter(获取值)方法,也就是对应的点语法。因为两个成员属性是公有的,我们可以在任何地方访问这些属性 例如我在main.m中,创建一个人类对象,给name属性赋值
那么既然有了setter和getter方法,为什么还要有KVC获取值和设置值的方法呢?
下面介绍一下KVC比普通setter 和 getter 方法强大的地方
我在HFPerson.m文件中添加一个延展,也就是人类的私有属性sex(性别)属性,
此时我们用断点看一下,人类对象中是有sex属性
下面我在main.m中给p1对象设置sex属性,看看会出现什么情况:
我们是没有办法在别的类中访问本类的私有属性的,那么我现在想实现在main.m中获取或者设置sex属性,那么怎么实现呢?
下面介绍KVC第一个强大的地方:
在KVC眼中,没有私有属性,任何属性都可以访问的到,那么我们用KVC在Main.m中设置p1对象的sex属性,并且获取sex属性
此时我们通过KVC给p1的sex私有属性,设置了值,也获取到了值,这是setter getter无法做到的,
这个方法名字:- (void)setValue:(nullable id)value forKey:(NSString *)key;
下面介绍一下方法:- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;这个方法可以实现上面方法的功能,那么和上面的方法有什么区别呢?
现在有一个新的需求:创建一个“书”(book)类,这个类中有一个名字(bookName)私有属性,此时我给刚才创建的人类添加一个(book)对象属性
接下来,我在main.m中创建书对象,赋值给p1对象的book属性
现在有一个新的需求,如何通过p1设置或者获取book的私有属性(bookName)的值?普通点语法肯定做不到
那么我用- (void)setValue:(nullable id)value forKey:(NSString *)key;方法呢
book.bookName 不是p1对象的属性成员。book是p1对象的属性成员,而bookName是book的属性成员 那么这个时候怎么通过p1直接修改bookName呢?
使用- (void)setValue:(nullable id)value forKeyPath:(NSString *)keyPath;方法
介绍一下这个方法,[p1 setValue:@"九阴真经" forKeyPath:@"book.bookName"];使用这个方法的时候,它会认为 . 前面是一个对象,这个对象是p1对象的成员属性, . 后面是这个对象的成员属性。这是这个方法独有的功能;
接下来,介绍一下第二个强大的功能:
就先介绍这几个功能吧,目前就学了这几个,以后有新的发现,会及时更新的。
第一次写博客,希望大家能看懂。