点语法的本质还是进行赋值和取值 也就是说点语法 最终自己会去调用属性的set方法 和get方法
当点语法在等号左边出现的时候 会调用该属性的set方法 其余的时候出现都是在调用该属性的get方法。
Child *child =[[Child alloc]init];
// 首先会去寻找这个类中与key对应的set方法 如果没有找到set方法 会继续寻找有没有一个_key的实例变量 继续没有找到 会找_isKey的实例变量 继续没有找到 会去找isKey的实例变量 如果还是没有找到 程序崩溃;
// 类内部的属性或者实例变量叫什么 key就写什么
// [child setValue:@"哈哈" forKey:@"name"];
// 通过KVC传入的是什么类型 取值就是什么类型 接收的属性或者实例变量 会根据自身的类型继续转换
// [child setValue:@"KVO" forKey:@"name"];
// NSLog(@"%@",[child valueForKey:@"name"]);
可以给一个空值;
// [child setValue:nil forKey:@"name"];
// [child setValue:@18 forKey:@"age"];
// [child sayHi];
// 对象类型可以给空值 非对象类型不可以给空值 否则会程序崩溃;
// 如果非对象类型传入空值 实现:-(void)setNilValueForKey:(NSString *)key
//这个方法则不会导致崩溃;(空实现即可);
// [child setValue:@2 forKey:@"age"];
// [child sayHi];
// 如果类内部没有与key值对应的实例变量或属性 进行赋值 会导致程序崩溃
// 如果实现-(void)setValue:(id)value forUndefinedKey:(NSString *)key 这个方法则不会导致程序崩溃;(空实现)
// [child setValue:@"男" forKey:@"gender"];
/ 通过A类给B类的属性赋值 首先会找A类中有没有SetB的方法 在去寻找B类中有没有setName的方法通过寻找key值路径 来进行最终的赋值;
// A*a =[[A alloc]init];
// [a setValue:@"哇哈哈" forKeyPath:@"b.name"];
// [a sayHi];