self.XXX和_XXX的区别及相关知识的延伸

主要有两个方面的区别:
1、self.XXX是通过set和get方法对属性的间接访问,会使引用计数加一,而_XXX是直接获取局部成员变量(实例变量是成员变量的一部分),不包含set和get方法。
2、self.XXX是对属性的间接访问,而_XXX是对成员变量的直接访问。
【注意】使用self.XXX是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下划线时忽略了self这个指针,self.容易在Block中造成循环引用(Block是个独立的运行单元,block中的self是强引用,例如加载完数据在block中使用self.tableView reloadData,会出现循环引用内存泄漏,可以定义__weak typeof(self) weakSelf = self,用weakSelf弱引用代替self强引用从而避免循环引用问题。同时,使用下划线是获取不到父类的属性,因为它只是对局部变量的访问。)
此外,再做一下延伸和扩展。
(1)成员变量和实例变量有何区别?
下面先看下成员变量的声明方法:
@interface MyObject : NSObject {
NSString *a;
NSInteger b;
}
@end

以上声明方法的花括号中的NSString*a和NSInteger b都是成员变量,但二者又有区别。成员变量a是一个对象指针(因为其前面带星号),故a又被称为实例变量。而成员变量b不是实例变量。简言之,实例变量是成员变量的子集。
(2)属性和成员变量有何区别?
属性就是通过@property声明的变量。区别有以下几点:
1)与成员变量不同的是,属性添加了存取方法,即setter和getter方法(Xcode编译器通过@synthesize自动添加);
2)属性默认会生成带下划线的成员变量;

参考文章:
http://www.jianshu.com/p/6ca11cbe4187
http://www.jianshu.com/p/167688b5a9f8

你可能感兴趣的:(self.XXX和_XXX的区别及相关知识的延伸)