@dynamic和@synthsize

2020-10-15  本文已影响0人  Sweet丶

一、使用上的区别

@synthesize age = _age; // 这个是默认的写法

@dynamic age; // 使用@peoperty时希望自己手动实现setter、getter、成员变量时的写法

@synthesize和@dynamic是不能同时使用的。

@synthesize age = _age;的作用是让编译器自动生成与属性age对应的成员变量_age, 同时自动生成settergetter方法的实现。

@dynamic age; 是让编译器不生成settergetter方法的实现, 也不生成与@property对应的成员变量;使用时,即使没有手动实现settergetter在编译期间也不会报错,在运行时会奔溃,找不到方法。
解决:

  1. 可以手动实现settergetter
  2. 在动态方法解析方法里面添加对应的实现,如下:
+ (BOOL) resolveInstanceMethod:(SEL)sel  
{  
    // Capture setName: and name method  
    if (sel == @selector(setName:)) {  
        class_addMethod([self class], sel, (IMP)setName, "v@:@");  
        return YES;  
    }  
    else if (sel == @selector(name)) {  
        class_addMethod([self class], sel, (IMP)getName, "@@:");  
        return YES;  
    }  
      
    return [super resolveInstanceMethod:sel];  
}  
  
void setName(id self, SEL _cmd, NSString* name)  
{  
    // Implement @property (copy)  
    if (((Person *)self)->_name != name) {  
        [((Person *)self)->_name release];  
        ((Person *)self)->_name = [name copy];  
    }  
} 

NSString* getName(id self, SEL _cmd)  
{  
    return ((Person *)self)->_name;  
} 

二、使用时候的报错

  1. @peoperty声明了属性,在.m文件中同时重写了setter和getter,会报错。解决方法:手动加上@synthesize age = _age;

  2. @peoperty声明了属性,在.m文件中使用@dynamic age; , 在运行时奔溃,原因上面已经讲过。

上一篇下一篇

猜你喜欢

热点阅读