self.和_xxx的用法的区别

  1. 首先通过self.xxx 通过访问的方法的引用:包含了set和get方法。而通过下划线是获取自己的实例变量,不包含set和get的方法。

  2. self.xxx是对属性的访问;而_xxx是对局部变量的访问。所有被声明为属性的成员,再ios5之前需要使用编译指令@synthesize 来告诉编译器帮助生成属性的getter和setter方法,之后这个指令可以不用认为的指定了,默认情况下编译器会帮助我们生成。编译器在生成getter,setter方法时是有优先级的,他首先查找当前的类中用户是否定义属性的getter,setter方法,如果有,则编译器会跳过,不会再生成,使用用户定义的方法。也就是说你在使用self.xxx时是调用一个getter方法。会使引用计数加一,而_xxx不会使用引用技术加一的。

  3. 如果self。xxx=self。aaa,那么左边就是set方法,右边是get方法,=号左边第一个点是set方法,=号右边最后一个点是get方法(自己粗陋的总结......)。

所有使用self.xxx是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下滑线的时候忽略了self这个指针,后者容易在BLock中造成循环引用。同时,使用 _是获取不到父类的属性,因为它只是对局部变量的访问。

 
最后总结:self方法实际上是用了get和set方法间接调用,下划线方法是直接对变量操作。

在最新的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方法的一个整合体,他主要是承担一个外部访问的一个接口!

实例变量只能在本类中才可以访问,外部不可以访问!

总的原则:

在类内部访问变量的时候用“_”;

在类外部也就是其他类里访问这个类的变量时用“.” 语法;
 
共同点self.shuxing  这样访问属性比如self.array.count 会触发其set方法。
而_shuxing 这样的访问方法比如_array.count 则不会。

注意事项:

手动管理内存的情况下:

使用“.”语法来初始化变量的时候,会产生内存泄漏的问题:

<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>



上述便是“.”和“_”在使用的时候的简单区别。

 
如果是在ARC(自动管理内存)的情况下虽然不存在上述问题,但从编码规范来考虑,还是注意点儿的好。
 

总结:1,self.是对属性的访问,使用它的时候编译器会判断_是否为空,为空的话自动实例化。会自动访问get和set方法

         2,_是对实例变量的访问,我们没有实例化它,不能使用

         3,对类里局部变量访问使用_,外部变量则用self.

         4,在getter方法中,不要再使用self。否则会重复调用getter方法,造成死循环
 
其他文章请移步个人博客: http://zhangqq166.cn/
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值