OC系列教程之属性调用方式

参考: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方法间接调用,下划线方法是直接对变量操作。

你可能感兴趣的:(OC系列教程之属性调用方式)