​- (void)setValue:(id)value forKey:(NSString *)key​​方法,实现原理与验证

功能:使用一个字符串标示符给一个对象的属性赋值.它支持普通对象和集合对象
这个方法的默认实现如下:


(1).首先去接收者(调用方法的那个对象)的类中查找与key相匹配的访问器方法(​​-set<Key>​​),如果找到了一个方法,就检查它参数的类型,如果它的参数类型不是一个对象指针类型,但是只为​​nil​​,就会执行​​setNilValueForKey:​​方法,​​setNilValueForKey:​​方法的默认实现,是产生一个​​NSInvalidArgumentException​​的异常,但是你可以重写这个方法.如果方法参数的类是一个对象指针类型,就会简单的执行这个方法,传入对应的参数.如果方法的参数类型是​​NSNumber​​或​​NSValue​​的对应的基本类型,先把它转换为基本数据类,再执行方法,传入转换后的数据.**



(2).如果没有对应的访问器方法(​​setter​​方法),如果接受者的类的​​+accessInstanceVariablesDirectly​​方法返回​​YES​​,那么就查找这个接受者的与​​key​​相匹配的实例变量(匹配模式为​​_<key>​​,​​_is<Key>​​,​​<key>​​,​​is<Key>​​):比如:​​key​​为​​age​​,只要属性存在​​_age​​,​​_isAge​​,​​age​​,​​isAge​​中的其中一个就认为匹配上了,如果找到这样的一个实例变量,并且的类型是一个对象指针类型,首先​​released​​对象上的旧值,然后把传入的新值​​retain​​后的传入的值赋值该成员变量,如果方法的参数类型是​​NSNumber​​或​​NSValue​​的对应的基本类型,先把它转换为基本数据类,再执行方法,传入转换后的数据.




(3).如果访问器方法和实例变量都没有找到,执行​​setValue:forUndefinedKey:​​方法,该方法的默认实现是产生一个 ​​NSUndefinedKeyException​​ 类型的异常,但是我们可以重写setValue:forUndefinedKey:方法


------------------越是喧嚣的世界,越需要宁静的思考------------------ 合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。 积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里;不积小流,无以成江海。骐骥一跃,不能十步;驽马十驾,功在不舍。锲而舍之,朽木不折;锲而不舍,金石可镂。蚓无爪牙之利,筋骨之强,上食埃土,下饮黄泉,用心一也。蟹六跪而二螯,非蛇鳝之穴无可寄托者,用心躁也。