self.xxx(属性)
属性定义如下,在头文件中定义则为公有属性,可以在其他文件中访问。在实现中定义则为私有,只能在.m文件中访问。
@property (nonatomic, copy) NSString *name;
属性可以使用点语法,如
self.name = @"pingping";
相当于调用实例方法,getter方法
NSString *name = self.name;
相当于调用实例方法,setter方法
_xxx (实例变量)
- Objective-C原则上不允许从对象外访问对象的实例变量的。
@interface People : NSObject {
NSUInteger age;
NSString *name;
} - 当上述实例变量定义在头文件中,默认可视性是@protected,可以在类、子类、同一类型的其他实例中访问,如people->age。若要改变访问权限,可通过@private、@public指定。
- 当上述实例变量定义在实现文件中,则对外部不可见,封装层次更高,但是在同类的实例中仍可通过->访问到。但是在子类中访问不到父类的实例变量。
属性与实例变量的联系
从iOS5开始,当在头文件中声明一个属性后,如name,编译器会自动在实现文件中生成实例变量_name,而且不需要使用
@synthesize name = _name;
大部分情况下,_xxx或self.xxx达到的效果是一样的,但还是有部分情况需要特别注意。接着往下看。
踩过的坑
1.懒加载时,如果不使用self.xxx是无法调用getter方法的,所以此时懒加载根本没用上,你的指针都是nil的状态。
2.要是用copy修饰属性,当使用_xxx语法时,是直接操作的原对象地址,不会触发copy操作,若你赋值的对象被修改了,那么你的属性值也被修改了。
3.在初始化init以及dealloc的方法中,可以使用_xxx语法,但在其他情况
下使用self.xxx比较合理
4.在dealloc方法中,若要使用部分属性,最好使用_xxx方式,若是该属性是懒加载而你用点语法访问,会造成crash。
网友评论