美文网首页
聊聊@property中self.var,_var,self->

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

作者: Alex1989 | 来源:发表于2021-01-04 00:15 被阅读0次

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

    • 老代码中声明一个@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修饰词,这时就需要手动生成。

    • 采用LLVM编译器后声明@property:
      1.自动生成 _xxx变量
      2.自动生成 _seter和getter方法。

    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方法。希望可以解决大家在声明属性书写不规范导致的隐患问题。

    相关文章

      网友评论

          本文标题:聊聊@property中self.var,_var,self->

          本文链接:https://www.haomeiwen.com/subject/axcmoktx.html