美文网首页
聊聊@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->

    iOS5.0之前声明@property的写法 老代码中声明一个@property的过程: 声明一个属性非常繁琐,后...

  • 告诉你使用self.var 和 _var的区别

    property & instance variable 最近有朋友问我关于oc中使用self.var和下划线_v...

  • self.var 与 _var

    虽然OC编程了那么久,但一直觉得我写的代码很乱。就如self.var 与 _var,他们的区别很简单,self.v...

  • iOS小知识点总结

    iOS中的self访问对象属性和下划线实例变量的区别 具体见:[告诉你使用self.var 和 _var的区别][...

  • 犯过的一些蠢错

    block直接使用私有变量_property 在代码块中直接访问私有变量相当于self->_property。虽然...

  • self.和下划线的区别

    self.var 通过访问方法的引用(包括set和get方法)_var 直接引用(不通过set和get方法) @...

  • 属性关键词

    @property 默认格式:@syntheszie var = _var; ARC中,默认修饰 基本数据类型@p...

  • get_property

    使用方法: get_property var_name property [-clock clock_name ]...

  • 2016-3-24

    ES5中的属性类型 named data property 数据属性 var obj = { name: 'mm'...

  • 回头聊聊@property、copy和深浅拷贝

    聊聊@property、copy和深浅拷贝 关于property的由来 property关键字为我们自动地生成 s...

网友评论

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

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