-
首先通过
self.xxx
通过访问的方法的引用:包含了set和get方法。而通过下划线是获取自己的实例变量,不包含set和get的方法。 -
self.xxx
是对属性的访问;而_xxx
是对局部变量的访问。所有被声明为属性的成员,再ios5之前需要使用编译指令@synthesize 来告诉编译器帮助生成属性的getter和setter方法,之后这个指令可以不用认为的指定了,默认情况下编译器会帮助我们生成。编译器在生成getter,setter方法时是有优先级的,他首先查找当前的类中用户是否定义属性的getter,setter方法,如果有,则编译器会跳过,不会再生成,使用用户定义的方法。也就是说你在使用self.xxx
时是调用一个getter方法。会使引用计数加一,而_xxx
不会使用引用技术加一的。 -
如果self。xxx=self。aaa,那么左边就是set方法,右边是get方法,=号左边第一个点是set方法,=号右边最后一个点是get方法(自己粗陋的总结......)。
所有使用self.xxx
是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下滑线的时候忽略了self这个指针,后者容易在BLock中造成循环引用。同时,使用 _
是获取不到父类的属性,因为它只是对局部变量的访问。
在最新的xcode中,已经不需要我们自己去写 set,get 方法,,系统已经自动帮我们生成set,get方法。
同时我们发现在我们访问我们声明的变量时,会有self. 和 以"_"开头的访问方式,那么这两种方式到底有什么样的区别呢?
我们来一起看一下:
<span style="color:#505050">
<span style="color:#954121">@property</span> (retain, <span style="color:#954121">nonatomic</span>) <span style="color:#0086b3">NSMutableArray</span> *nameArray;<span style="color:#954121">self</span><span style="color:#008080">.nameArray</span>是访问属性的,而_nameArray是访问实例变量的.
</span>
属性是实例变量加上GET,SET方法的一个整合体,他主要是承担一个外部访问的一个接口!
实例变量只能在本类中才可以访问,外部不可以访问!
总的原则:
在类内部访问变量的时候用“_”;
注意事项:
手动管理内存的情况下:
使用“.”语法来初始化变量的时候,会产生内存泄漏的问题:
<span style="color:#505050">
<span style="color:#954121">self</span>.nameArray = [NSMutaleArray alloc] init];
</span>
上述代码,造成的问题是,在self.nameArray的时候相当于调用了set方法,引用计数+1,后面alloc的时候,引用计数再次+1。
在我们最后dealloc中release的时候,引用计数只减了一次,并没有完成全部释放,这样就造成了内存泄漏的问题。
解决方法:就是用“_”来初始化以及访问变量,这样就不会产生内存问题,虽不是什么高明的办法,但的确有效。
<span style="color:#505050">
_nameArray = [NSMutaleArray alloc] init];
</span>
上述便是“.”和“_”在使用的时候的简单区别。
总结:1,self.是对属性的访问,使用它的时候编译器会判断_是否为空,为空的话自动实例化。会自动访问get和set方法
2,_是对实例变量的访问,我们没有实例化它,不能使用
3,对类里局部变量访问使用_,外部变量则用self.