1 区别
- self.xxx 是访问属性的——默认情况下,属性名会自动生成setter和getter方法,即属性是实例变量加上GET,SET方法的一个整合体,他主要是承担一个外部访问的一个接口,在类外部也就是其他类里访问这个类的变量时用“.” 语法
- xxx 是访问实例变量的——实例变量只能在本类中才可以访问,外部不可以访问,在类内部访问变量的时候用“”;。
2 举例
@property (retain, nonatomic) NSMutableArray *nameArray;
//self.nameArray是访问属性的
//_nameArray是访问实例变量的
3 注意事项
- 手动管理内存的情况下:
使用“.”语法来初始化变量的时候,会产生内存泄漏的问题:
self.nameArray = [NSMutaleArray alloc] init];
上述代码,造成的问题是,在self.nameArray的时候相当于调用了set方法,引用计数+1,后面alloc的时候,引用计数再次+1。
在我们最后dealloc中release的时候,引用计数只减了一次,并没有完成全部释放,这样就造成了内存泄漏的问题。
- 解决方法:就是用“_”来初始化以及访问变量,这样就不会产生内存问题,虽不是什么高明的办法,但的确有效。(如果是在ARC(自动管理内存)的情况下虽然不存在上述问题,但从编码规范来考虑,还是注意点儿的好.)
_nameArray = [NSMutaleArray alloc] init];