看别人源码,风格有些不一样。
比如在@interface
中声明的xxx这个成员变量。
在@implementation
的方法中使用。
从原理上来说,self.xxx
和直接使用下划线的_xxx
,到底有区别吗?
看别人源码,风格有些不一样。
比如在@interface
中声明的xxx这个成员变量。
在@implementation
的方法中使用。
从原理上来说,self.xxx
和直接使用下划线的_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时候加上参数判断,这样起到了保护作用。
2 回答1k 阅读
1 回答1.1k 阅读✓ 已解决
1 回答2.7k 阅读
1 回答1.5k 阅读
1 回答1.4k 阅读
1.7k 阅读
1 回答902 阅读
用@property关键字来声明的属性,在编译期会默认生成一个下划线加名称的属性变量,并且自动在implemention文件中生成setter和getter方法。
使用_yourName的方式是直接引用变量,而通过点语法调用self.yourName这种形式,实际是调用setter或getter方法!
经常会有些需要来重写属性的getter和setter方法,此时就需要使用点语法。
这并不是风格问题,而且逻辑问题!同时在当前Class的初始化方法和dealloc方法中最好不使用点语法调用实例属性,会有意想不到的问题