1、子类重写父类的属性,编译器不会合成带下划线的属性,需要自己手动合成setter和getter,否则这个属性将由父类实现,也就是说如果子类没有手写set和get方法,声明的@property相当于没写
2、在 oc 中属性就是给一个类的成员变量提供封装:
Objective-C properties offer a way to define the information that a class is intended to encapsulate。
通过声明属性,我们可以很简单的为一个成员变量定义其是否是只读的还是读写的,是否是原子操作的等等特性,也就是说如果说封装是为成员变量套了一层壳的话,那么 @property关键字做的事情就是预定义这层壳是个什么样子的壳,然后通过 @sythesize关键字生成真正的壳并把这个壳套在实际的成员变量上(如果没有定义这个成员变量该关键字也可以自动生成对应的成员变量)。当然这层壳包括了自动生成的 get set 方法。
在最开始的时候,我们在代码中写了@property对应的就要写一个@sythesize,在苹果使用了 LLVM 作为编译器以后,如果我们没有写 @sythesize,编译器就会为我们自动的生成一个 @sythesize property = _property。这个特性叫做Auto property synthesize。
3、@dynamic 关键字不会自动生成 setter 和 getter 方法,但由于子类已经继承了父类的 setter 和 getter ,可以不用写。但用@dynamic这种情况下得注意父类和子类的读写设定是一样的
4、有一个场景是子类继承了父类的协议,父类和子类分别有 id<FatherDelegate> delegate 与 id<SonDelegate> delegate 两个属性,在子类中使用 @synthersize delegate = _delegate; 时提示子类 delegate 尝试使用父类声明的实例变量 _delegate ,且二者类型不匹配。
这个warning
是说子类的属性类型和从父类继承的不符合,但是实际情况应该还是覆盖了父类的继承的属性,如果想让这个 warning 消失掉,只要把子类的协议声明成:@protocol Son <NSObject,Father>
就行,用@dynamic
后 get 和 set 方法应该获取到的是父类类型的 delegate