[11]@property @synthesize @dynam
kvo监控:
原因:因为@property默认给该属性生成getter和setter方法,当getter和setter方法同时被重写时,则系统就不会自动生成getter和setter方法了,也不会自动帮你生成_num变量,所以不会识别。
小知识:声明的property如果没有特意指定synthesize的话,那么Objective-C就会自动的给你声明一个_开头的实例变量。
_xxx访问的是xxx的地址。self.xxx访问的是xxx的getter。这两者并不是完全等价的,self.xxx是用objc_msgSend发消息,_xxx或者self->xxx则是直接访问内存地址,一般建议在init里面用_xxx,其他地方用self.xxx.
你要知道的@property都在这里
转载请注明出处 http://blog.csdn.net/u014205968/article/details/64443487
@property深入代码理解
@property = ivar + getter + setter
ivar就是实例变量,编译器会帮我们自动生成名字为'_属性名'这样的实例变量,同时也会自动生成getter和setter方法。
@synthesize表示为这两个属性自动生成名为_name和age的底层实例变量,并自动生成相关的getter和setter也可以不写编译器默认会自动生成'属性名'的实例变量以及相关的getter和setter。
这里所说的编译器自动生成的实例变量就如同我们在上文中手动创建setter和getter时声明的变量_name和_age。也就是说编译器会在编译时会自动生成并使用_name和_age这两个变量来存储这两个属性,跟name和age没什么关系了,只是我们在上层使用这两个属性的时候可以用name和age的点语法来访问getter和setter。如果不想使用这两个名字用于底层的存储也可以任意命名,但最好按照官方的命名原则来命名。
2019-05-08 10:48:38.793506+0800 AppInitialization[21418:4376867]
*** Terminating app due to uncaught exception 'NSUnknownKeyException',
reason: '[<DemoView 0x153e18350> valueForUndefinedKey:]:
this class is not key value coding-compliant for the key demoTestStr.'
valueForKey 的取值顺序
先按照 getKey 、key 、isKey 、_key 顺序查找方法取值,如果没有找到方法则查看accessInstanceVariablesDirectly 类方法的返回值,如果返回的是 NO,则抛出异常。如果返回的是YES,按照_key 、_isKey 、key 、isKey 顺序查找成员变量,如果没有找到,则抛出异常。