今天被一个最近在学 iOS 的同事问了一个问题:属性写在 .h 文件中和在 .m 文件中有什么区别?当时错愣了一下,隐约记得似乎有区别的,但是想不起来,根据自己的经验告诉他,说没区别,结果找了资料发现自己错了,好尴尬,把这些基础的给忘了。
属性在 .h 文件中和在 .m 中声明是有区别的。区别就是,在 .h 文件中声明的属性,外部类可以通过「类实例.属性」来调用,但在 .m 中声明的则不可以,获取和设置的方法,只能是通过 setValue:forKey
和 valueForKey
来实现。
成员变量,有三种权限,就是大家都知道的 @private、@protected、@public ,写在 .m 文件中时,相当于是 @private 权限,子类无法访问,验证了一下,做权限修改也无效。而写在 .h 文件中,默认是 @protected 权限,子类可以访问,可以做权限修改。因为访问权限指针对 .h 文件。.h 文件中成员变量,外部类对其的调用,跟 C++ 一样,用 ->
来调用。
@interface 部分为类扩展(extension)。
其被设计出来就是为了解决两个问题的:其一,定义类私有方法的地方。其二,实现 public readonly,private readwrite 的 property(意思是在 h 头文件中定义一个属性对外是 readonly 的,但在类的内部希望是可读写的,所以可以在 m 源文件中的 @interface 部分重新定义此属性为 readwrite,此时此属性对外是只读的,对内是读写的)。
此外,也可在此部分申明变量和属性,但申明的变量,属性和方法均为私有的,只能够被当前类访问,相当于 private。