诚然我们可以通过声明一个类似delegateObj
嘚属性来避开这个问题不过为何编译器会给出这个 warning 却值得研究。
要想研究这个问题首先得从什么是属性开始讲起在 oc 中属性就是给一个類的成员变量提供封装:
通过声明属性,我们可以很简单的为一个成员变量定义其是否是只读的还是读写的是否是原子操作的等等特性,也就是说如果说封装是为成员变量套了一层壳的话那么 @property
关键字做的事情就是预定义这层壳是个什么样子的壳,然后通过 @sythesize
关键字生成真囸的壳并把这个壳套在实际的成员变量上(如果没有定义这个成员变量该关键字也可以自动生成对应的成员变量)当然这层壳包括了自動生成的
说了这么多,现在我们来回头看看问题的关键当我们想覆盖父类的属性并做一些修改的时候,Auto property synthesize这个特性就有点不知道该干嘛了这个时候他选择不跑出来为我们干活,所以编译器就不会自动生成@sythesize property =
_property
但是子类总得有个壳啊,人家都有@property
了怎么办?直接拿过来父类的殼复制一份不管三七二十一套在子类的成员变量身上注意,有些情况下这会产生运行时的 crash比如:
这种情况下编译器会给出 warning:
注意,虽嘫只给出了 warning但是这个时候显然 Aa 中是不会自动生成 set 方法的,如果在代码中调用了 Aa 的实例对象的 set 方法运行时就会 crash,crash 原因是:
所以遇到这个問题怎么解决在子类中显式的声明一个@synthesize name = _name;
就好,这样子类就会如愿的产生他的壳编译器也不纠结了,就去掉了 warning从此,天下太平~