美文网首页
@dynamic和@synthsize

@dynamic和@synthsize

作者: Sweet丶 | 来源:发表于2020-10-15 07:30 被阅读0次

    一、使用上的区别

    @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; , 在运行时奔溃,原因上面已经讲过。

    相关文章

      网友评论

          本文标题:@dynamic和@synthsize

          本文链接:https://www.haomeiwen.com/subject/dtqnpktx.html