聊聊@property中self.var,_var,self->

2021-01-04  本文已影响0人  Alex1989

iOS5.0之前声明@property的写法

@interface ViewController ()
{
   // 1.声明成员变量
    NSString *varStr;  
 }
 //2.在用@property
@property(nonatomic, copy) NSString *varStr;  
@end

@implementation ViewController
//3.在@implementation中用synthesize生成setter方法
@synthesize varStr;  //合成方法的意思 
@end

声明一个属性非常繁琐,后来 Apple弃用gcc编译器,使用LLVM编译器(low level virtual machine),才不再需要为属性声明实例变量了。
如果我们不需要系统自动生成setter和getter方法可以使用@dynamic修饰词,这时就需要手动生成。

self.var,_var,self->_var声明语义

self->_var:这个和C++的作用一样访问_var变量,这样访问不会调用setter和getter方法
self.var:这个就要区分是取值还是赋值了

如果是赋值: self.var = xxxxx,此操作会调用setter方法。
如果是取值: id xxxxx = self.var 此操作会调用getter方法。

_var:这种调用也是直接取值,不会和调用setter和getter方法。与self->_var写法等效。

总结

在实际运用中,可能由于对属性语法的不了解,在setter和getter方法中明明声明了逻辑,却没有执行。举个例子:
我们在getter方法中声明了懒加载的代码:

@interface ViewController ()
@property(nonatomic, copy) NSString *varStr;  
@end

@implementation ViewController
- (NSString *)varStr {
  _varStr.xxx  = xxxx
  _varStr.xxx  = xxxx
  return _varStr;
}
- (void)viewDidLoad{
  _varStr = [[NSString alloc] init]//这样调用悲剧就出现了,_varStr 是不会触发getter方法的
}
@end

在运用懒加载的时候,没有调用self.xxx = xxx,而是调用的_varStr = xxx。这样就不会调用getter方法。希望可以解决大家在声明属性书写不规范导致的隐患问题。

上一篇 下一篇

猜你喜欢

热点阅读