IOS开发笔记 ——@dynamic 和 @synthesize 和区别

@dynamic 和 @synthesize 和区别

当我们设置一个类的变量的时候,我们会考虑设置属性,也就是@property ,当我们设置玩属性后,我们要实现它的 get 和 set 方法,但是现在的编译器默认已经帮我们实现好了,也就是我们@synthesize。
@synthesize 的作用就是帮我们实现 get 和 set 方法,如下

@property (nonatomic,copy) NSString *author;

// set
- (void)setAuthor:(NSString *)author {
    [_author release];
    [author retain];
    _author = author
}

// get
- (NSString *)author {
    return _author;
}

而 @ dynamic 表示这个成员变量的 getter 和 setter 方法并不是直接由编译器生成,而是手工生成或者运行时生成。
这就是 @dynamic 的作用,那么我们该怎么运用运行时来生成 get 和 set 方法呢?以下是我给出的例子

#import 
@interface Book : NSObject
{
    NSMutableDictionary *data;
}
@property (nonatomic,copy) NSString *title; // 书名
@property (nonatomic,copy) NSString *author; // 作者
@end


@implementation Book

// @ dynamic 表示这个成员变量的 getter 和 setter 方法并不是直接由编译器生成,而是手工生成或者运行时生成。
@dynamic title;
@dynamic author;

- (void)dealloc {
    TT_RELEASE_SAFELY(data)
    TT_RELEASE_SAFELY(self.title)
    TT_RELEASE_SAFELY(self.author)
}

- (instancetype)init {
    if (self = [super init ]) {
        data = [[NSMutableDictionary alloc]init];
        [data setObject:@"Tom Sawyer" forKey:@"title"];
        [data setObject:@"Mark Twain" forKey:@"author"];
    }
    return self;
}


- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    NSString *selector = NSStringFromSelector(aSelector);
    if ([selector hasPrefix:@"set"]) {
    // c 类型的 set 方法
        return [NSMethodSignature signatureWithObjCTypes:"v@:@"];
    }else {
    // c 类型的 get 方法
        return [NSMethodSignature signatureWithObjCTypes:"@@:"];
    }
}

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    NSString *key = NSStringFromSelector([anInvocation selector]);
        if ([key hasPrefix:@"set"] ) { // 判断是否为 set 方法
        // 除去 set 以后,拿到属性的小写全称
        key = [[key substringWithRange:NSMakeRange(3, [key length]-4)] lowercaseString];
        NSString *obj;
        // 修改 obj 的地址来存储 set 值
        [anInvocation getArgument:&obj atIndex:2];
        // 修改 collection 对象的值
        [data setObject:obj forKey:key];
    } else {
        NSString *obj = [data objectForKey:key];
        [anInvocation setReturnValue:&obj];
    }
}

你可能感兴趣的:(IOS开发笔记)