在Protocol或者Category中是不可以添加属性,但是还是看到这样写的代码。
完整的属性包括成员变量和setter、getter两个方法,在Protocol或者Category中添加属性,系统无法自动为这些属性生成成员变量和方法实现,但是方法声明是有的,因此可以尝试去调用,但是实际会报错
unrecognized selector sent to instance
所以在Protocol或者Category中添加属性,实际仅仅添加了方法声明,这和一般的仅仅在协议添加方法并没有区别,仅仅看起来不同而已。
这么写的其实也就代码简洁一点,和直接声明方法是一样的。
既然系统不能为我们自动合成成员变量和方法实现,那我们自己实现setter和getter方法就可以。经常使用的self.view.height就是这样。在声明属性后,自己实现setter和getter方法,这样就可以安全的调用。注意在setter和getter并没有用到与声明的属性相匹配的成员变量,因为,那个变量还是不存在。
通过运行时的方法去关联的一个额外定义的变量,其实实际和完整意义的定义属性没什么关系,毕竟,定义属性一般认为会自动生成成员变量和setter、getter方法实现,如果都自己实现,定义属性毫无意义可以。