OC中使用【self.xxx】和【_xxx】有什么区别吗?

看别人源码,风格有些不一样。

比如在@interface中声明的xxx这个成员变量。
@implementation的方法中使用。
从原理上来说,self.xxx和直接使用下划线的_xxx,到底有区别吗?

阅读 13.5k
7 个回答

用@property关键字来声明的属性,在编译期会默认生成一个下划线加名称的属性变量,并且自动在implemention文件中生成setter和getter方法。

使用_yourName的方式是直接引用变量,而通过点语法调用self.yourName这种形式,实际是调用setter或getter方法!

经常会有些需要来重写属性的getter和setter方法,此时就需要使用点语法。

这并不是风格问题,而且逻辑问题!同时在当前Class的初始化方法和dealloc方法中最好不使用点语法调用实例属性,会有意想不到的问题

self.xxx 实际上是 调用了 getter 方法
而 _xxx 则类似于 直接赋值

这是一个历史遗留的传统,以前必须先声明一个类成员变量,后来推出了点语法,就必须实现setter和getter方法,后来出现了@property自动生成setter和getter的声明,@synthesize生成setter和getter的具体内容,再后来做了简化,直接一个@property帮你全搞定了

使用self.是对属性的访问。使用_是对局部变量的访问。当我们使用self.XXX的时候是在调用了这个属性的getter方法,无论是系统帮你写的还是你自己重写的,在getter方法中判断局部变量是否为空,如果为空,创建实例,并返回。也就是说我们在使用self.时能保证它有实例,不为空。

都在说是set和get方法的区别。那我说说这有啥区别。
比如人是一个类,有个年龄属性age ,我们定义为int型。那么问题来了,给这个人的年龄设置为负10行么?当然不可以。所以我们把age设置为private属性,对调用它的类不可见,然后提供两个接口,set,get, set时候加上参数判断,这样起到了保护作用。

知道什么是懒加载吗?懒加载可以通过重写get方法实现。索引self.和_还是有区别的

一个是调getter方法获得
一个是直接访问地址获得

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题