Objective-C成员变量和属性

在OC中常见两种变量的定义方式,一种是在@interface的大括号内的成员变量;另一种是在大括号外、跟在@property后面,这种被称为属性

本文介绍了OC中成员变量和属性的区别及使用中需要注意的地方。

成员变量的三种权限

@private:只有类内可以访问
@protected:类内和子类可以访问
@public:类内、其子类和类外都可以访问

子类继承父类的成员变量权限。

属性@property

属性是用来替代声明存取方法的一种便捷方式。它可以自动生成getter和setter,并可以通过点表达式来访问。

在实现部分使用@synthesize来合成实例变量(ivar)+getter+setter,并根据小括号内的关键字进行内存管理。另外也可以使用@dynamic表明存取方法由程序员手动提供,此时编译器不会自动合成属性。

不手动@synthesize时,编译器也可以自动合成实例变量,即在变量名前加下划线。

_xxx和self.xxx的区别

_xxx直接访问xxx属性的地址,等同于使用箭头表达式(self->xxx);
self.xxx则调用了getter方法,是发消息(objc_msgSend),相当于[self xxx]。

一般在init时使用_xxx,其他时候使用self.xxx。

明白了这一点也可以帮助理解点表达式(.)与箭头表达式(->)的区别,详细见下节。

点表达式与箭头表达式的区别

点表达式(.)与C语言中作用不同,在OC中,点表达式只是保留了一种习惯的书写方法,实际执行的是getter/setter方法,也即给对象发消息(objc_msgSend)。

箭头表达式(->)用于访问指向对象成员的指针。

成员变量与属性的区别

大括号中声明的成员变量只能在类内部使用。在括号外只能使用KVC的方式来访问,不支持点表达式。

而使用@property声明的属性可以从类外访问。类内使用这类变量时用_xxx或self.xxx。

.h和.m文件中的@interface的区别

属性:

  • .h中声明的属性,从类外可以使用点表达式访问;
  • .m中的不可以,只能使用KVC方式访问(类似于成员变量)。

成员变量:

  • .h中成员变量默认@protected,子类可以访问,可以修改其权限;
  • .m中成员变量默认@private,子类无法访问无法修改权限。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注