文章目录
关于 self
self 可以用在类方法,也可以用在实例方法
self 指的是当前执行的对象,而不一定是self 所在的这个类文件。
比如逆向中,方法被混淆了,那么self 指的是调用方法的那个对象。
self 和 下划线
通过self.xxx 访问属性的方法,包含了set和get方法。
而通过下划线是获取自己的实例变量,不包含set和get的方法。
例如:
@property (nonatomic,copy) NSString *propertyName;
self.propertyName
是对属性的访问;
_propertyName
是对局部变量的访问。
@property 的声明中,编译器在生成 getter,setter 方法时是有优先级的,它首先查找当前的类中,用户是否已定义属性的 getter,setter 方法,如果有,则编译器会跳过,不会再生成,使用用户定义的方法。
1、使用self.propertyName 时,是都在调用一个 getter方法。self.propertyName 会让计数器+1;
而_propertyName,是直接调用变量,不通过 getter 方法, 类似于 self->_propertyName。
2、self.xxx 可以兼容懒加载,同时也避免了使用下滑线的时候,忽略了self 这个指针,后者容易在 bLock 中造成循环引用。
3、使用下划线获取不到父类的属性。