iOS Auto property synthesis will not synthesize property 'XXX'

Auto property synthesis will not synthesize property 'XXX';
it will be implemented by its superclass, use @dynamic to acknowledge intention

父类中已经有一个这样的属性,而你又在子类中进行了声明,编译器就会给出警告

通过声明属性,我们可以很简单的为一个成员变量定义其是否是只读的还是读写的,是否是原子操作的等等特性,也就是说如果说封装是为成员变量套了一层壳的话,那么 @property关键字做的事情就是预定义这层壳是个什么样子的壳,然后通过@sythesize关键字生成真正的壳并把这个壳套在实际的成员变量上(如果没有定义这个成员变量该关键字也可以自动生成对应的成员变量)。当然这层壳包括了自动生成的 get set 方法。
在最开始的时候,我们在代码中写了@property对应的就要写一个@sythesize在苹果使用了 LLVM 作为编译器以后,如果我们没有写 @sythesize,编译器就会为我们自动的生成一个 @sythesize property = _property。这个特性叫做Auto property synthesize

当我们想要覆盖父类的属性并且做出修改的时候,Auto property synthesize就不知道自己该干啥了,那编译器也不会生成@sythesize property = _property但是已经@property了,此时如果仍旧使用父类的壳,在有些情况下会产生运行时crash,比如:一个属性在父类中是readonly特性,但是在子类中声明了readwrite特性,因为父类中是readonly不会生成set方法,但是在子类中如果调用set方法,就会crash

附上crash原因:

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '-[Class setXXX:]: unrecognized selector sent to instance

所以遇到这种情况,我们解决方法就是,在子类.m中显式的声明一个 @synthesize XXX = _XXX 即可,如:

#import "LPMySelfShopListModel.h"

@implementation LPMySelfShopListModel
@synthesize ctitle = _ctitle;//适用于所有特性的数据类型
/*  或者 **/
//@dynamic ctitle;//对改变读写特性的属性,不适用
@end

 

你可能感兴趣的:(Objective-C)