码迷,mamicode.com
首页 > 其他好文 > 详细

动态方法解析的例子

时间:2017-10-13 22:35:14      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:str   nsdate   dex   har   void   删除   time   add   eth   

#import <Foundation/Foundation.h>

@interface SFAutoDictionary : NSObject

@property (nonatomic, strong)NSString *string;
@property (nonatomic, strong)NSNumber *number;
@property (nonatomic, strong)NSDate *date;
@property (nonatomic, strong)id opaqueObject;

@end

 

 

#import "SFAutoDictionary.h"
#import <objc/runtime.h>


@interface SFAutoDictionary ()
@property (nonatomic, strong)NSMutableDictionary *backingStore;
@end

@implementation SFAutoDictionary

id autoDictionaryGetter(id self, SEL _cmd) {
    SFAutoDictionary *dictSelf = (SFAutoDictionary *)self;
    NSMutableDictionary *backingStore = dictSelf.backingStore;
    
    NSString *key = NSStringFromSelector(_cmd);
    
    return [backingStore objectForKey:key];
    
}

void autoDictionarySetter(id self, SEL _cmd, id value) {
    SFAutoDictionary *dictSelf = (SFAutoDictionary *)self;
    NSMutableDictionary *backingStore = dictSelf.backingStore;
    
    NSString *selectorString = NSStringFromSelector(_cmd);
    NSMutableString *key = [selectorString mutableCopy];
    
    //删除:
    [key deleteCharactersInRange:NSMakeRange(key.length-1, 1)];
    
    //删除set
    [key deleteCharactersInRange:NSMakeRange(0, 3)];
    
    //小写
    NSString *lowercaseFirstChar = [[key substringToIndex:1] lowercaseString];
    [key replaceCharactersInRange:NSMakeRange(0, 1) withString:lowercaseFirstChar];
    
    if (value) {
        [backingStore setObject:value forKey:key];
    }else{
        [backingStore removeObjectForKey:key];
    }
    
}

- (instancetype)init {
    if (self = [super init]) {
        _backingStore = [[NSMutableDictionary alloc] init];
    }
    return self;
}

+ (BOOL)resolveClassMethod:(SEL)sel {
    NSString *selectorString = NSStringFromSelector(sel);
    if ([selectorString hasPrefix:@"set"]) {
        class_addMethod(self, sel, (IMP)autoDictionarySetter, "v@:@");
    }else{
        class_addMethod(self, sel, (IMP)autoDictionaryGetter, "@@:");
    }
    return YES;
}

@end

 

动态方法解析的例子

标签:str   nsdate   dex   har   void   删除   time   add   eth   

原文地址:http://www.cnblogs.com/gkp307/p/7663416.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!