我正在研究@dynamic和@synthesize的差异,因此我举了一个小例子(简单):
@interface Classe : NSObject
@property (nonatomic) int value;
@end
@implementation Classe
@synthesize value;
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Classe *cl = [[Classe alloc] init];
cl.value = 50;
NSLog(@"%d",cl.value);
}
return 0;
}
从我对这个示例的理解中可以看出,“synthesize”在后台创建了getter和setter方法,正如我们上面所看到的,我只做
cl.value = 50;
。现在,让我们谈谈@dynamic,我听到了
只是一种通知系统不要生成吸气剂/设置剂的方法
对于这个事情,您(或其他人)会为您提供它们。
好的,如果在上面的示例中,我将
@synthesize
更改为@dynamic
,则应用程序将在返回以下消息时出错:无法识别的选择器已发送到实例0x10010eeb0
这是因为据说编译器不会创建getters和setters方法,因此我该如何手动创建getters和setters方法?
最佳答案
好吧,你只是做。如果您的 property 有名字
@property (nonatomic) int value;
然后在实现中,您只需定义方法:
-(int)value {
//your getter here
}
-(void)setValue:(int)newValue {
//Your setter here
}
而且您不需要
@dynamic
就能做到。您可以编写一个getter和setter。您可能需要@synthesize
。因为如果您指定自己的getter 和设置程序,则编译器不会为您生成实例变量(_value
)。要实现它(如果需要),您将需要@synthesize
。有关它的更多信息:SO: Getters, setters and underscore property names。
关于ios - 无法识别的选择器发送到实例@dynamic,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29098979/