@property疑难杂症

@property疑难杂症

@property大家都知道能够根据给定的内存管理语意以及原子性和非原子性的设置自动合成对应的setter和getter方法。但是@property具体在背后除此之外还干了什么就不一定了解了。而由于这些不了解所带来的开发中的困惑和卡顿也尤为令人不快,笔者在写这篇博客的时候也遇到了同样的这些问题,现在查明这些疑难杂症,将其一一破解。

@property的发展历程经历两个阶段,当@property语法糖刚被引入进Objc时,@property是作为生成set和get方法的语法糖而存在的,仅在.h文件中自动生成accessor的方法声明,程序员还是要写出实例变量,配合@synthesize来指出要合成存取方法的变量。第二个阶段是,@property变得更加的自动化,除生成accessor方法外,还可以直接完成以前@synthesize的功能,并且生成实例变量。

但是这引发了一些困惑,这些困惑苹果的官方文档说的也不甚清楚。

  1. 由编译器合成的实例变量的继承范围可见性是什么?

    对于继承父类中声明为@protected和@private的变量而言,在子类中访问这些变量会被明确告知变量是private的,无法访问。但是对于在子类中用_iva的方式访问父类自动合成出来的实例变量,只是简单的提示变量不存在。所以对于合成出来的实例变量是没法确定其继承范围的,子类在继承父类时,只能通过访问accessor方法来访问这些实例变量。

  2. 编译器将这些实例变量合成在哪里呢?

    精确的位置并没有查到,但是确定的是合成在出现@synthesize的文件,也就是.m文件中,对于在@implementation synthesize的变量和可能是作为类的私有变量声明在.m文件中了。

  3. 要注意的问题:

    当你复写了get和set方法之后@synthesize就不会起作用了,这也就意味着你的类不会自动生成出来的实例变量了。你如果要复写set get方法你就必须要自己声明实例变量。

参考资料:

  1. Objective-C: Compiler error when overriding a superclass getter and trying to access ivar
  2. What is the visibility of @synthesized instance variables?
    原文作者:Hancock_Xu
    原文地址: https://segmentfault.com/a/1190000002944569
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞