参考:https://blog.csdn.net/u013378438/article/details/44200917
https://blog.csdn.net/aaidong/article/details/46998481
https://blog.csdn.net/lichuanlong007/article/details/52209173
目前@property 属性变量有两种调用方式,self.a和_a两种方式。
例子
例如:test的声明如下:
@interface Test:NSObject
@property int a;
-(void) changeAValue:(int) newValue;
@end
在类的实例方法中,我们可以用下面两种方式来访问a属性:
1、直接用属性名访问:
[objc]
-(void) changeAValue:(int) newValue
{
_a = newValue; // 默认生成的属性成员变量前面会自动加上“_”前缀
}
2、通过self.a的形式访问
[objc]
-(void) changeAValue:(int) newValue
{
self.a = newValue;
}
方法对比
1. 首先通过self. 通过访问的方法的引用:包含了set和get方法。
但是,通过下划线是获取自己的实例变量,不包含set和get的方法。
2. @property
(nonatomic,copy) NSString *propertyName;
self.propertyName是对属性的访问;使用_propertyName是对局部变量的访问。
所有被声明为属性的成员,在iOS5
之前需要使用编译器指令@synthesize来告诉编译器帮助生成属性的getter,setter方法。之后这个指令可以不用人为指定了,默认情况下编译器会帮我们生成。
编译器在生成getter,setter方法时是有优先级的,它首先查找当前的类中用户是否已定义属性的getter,setter方法,如果有,则编译器会跳过,不会再生成,使用用户定义的方法。
也就是说你在使用self.propertyName 时是在调用一个getter方法。
self.propertyName 会让计数器+1;_propertyName却不会。_propertyName是类似于self->_propertyName。
3. 用self.propertyName 是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下划线的时候忽视了self这个指针,后者容易在block中造成循环引用。同时,使用_是获取不到父类的属性,因为它只是对局部变量的访问。
4. self方法实际上是用了get和set方法间接调用,下划线方法是直接对变量操作。
网友评论