我正在研究@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/

10-13 00:16