Objective-C 中self.与_访问方式的区别

Objective-C中属性self.a与_a访问的区别:

在OC中我们可以通过指令@property定义属性。

OC对属性封装了许多方法,同时也会自动实现一些方法,相比实例变量,感觉更加面向对象些。

一般定义属性的方法如下,在Class Test中定义属性int a。

@interface Test:NSObject
@property int a;
-(void) changeAValue:(int) newValue;
@end

在类的实例方法中,我们可以用下面两种方式来访问a属性:

1、直接用属性名访问:

-(void) changeAValue:(int) newValue
{
    _a = newValue;  // 默认生成的属性成员变量前面会自动加上“_”前缀
}

2、通过self.a的形式访问

-(void) changeAValue:(int) newValue
{
    self.a = newValue;
}

这两种访问方式有区别吗?答案是肯定的。

通过第一种方式访问,其实是类似于C++的访问方式,是直接访问的实例变量并赋值。而第二种方式,并不像其表面那么直观,它其实是通过调用编译器自动生成的对于a变量的赋值函数来实现的。即

-(void) changeAValue:(int) newValue
{
    self.a = newValue; // 此处实际是调用 [self setA:newValue];
}

个人感觉在类中调用自身的属性,还是用self.a的形式比较好。因为它封装了访问方法,加强了我们对变量的控制,也更面向对象些。