OC高效率52之理解消息轉發機制

#pragma mark 演示動態方法解析
#import <Foundation/Foundation.h>

@interface EOCAutoDictionary : NSObject

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

@end

#import "EOCAutoDictionary.h"
#import <objc/runtime.h>
@interface EOCAutoDictionary()
@property (nonatomic ,strong) NSMutableDictionary *backingStore;


@end


@implementation EOCAutoDictionary
//聲明@dynamic 編譯器就不會自動爲其生成實例變量及存取方法
@dynamic string , number , date , opaqueObject;

-(id)init
{
    if (self = [super init])
    {
        _backingStore = [NSMutableDictionary new];
    }
    return self;
}
id autoDictionaryGetter(id self ,SEL _cmd){
    EOCAutoDictionary *typedSelf = (EOCAutoDictionary*)self;
    NSMutableDictionary *backingStore = typedSelf.backingStore;
    
    NSString *key = NSStringFromSelector(_cmd);
    
    return [backingStore objectForKey:key];
}

void autoDictionarySetter(id self , SEL _cmd,id value){
    EOCAutoDictionary *typedSelf = (EOCAutoDictionary*)self;
    NSMutableDictionary *backingStore = typedSelf.backingStore;
    
    
    NSString *selectorString = NSStringFromSelector(_cmd);
    NSMutableString *key = [selectorString mutableCopy];
    
    [key deleteCharactersInRange:NSMakeRange(key.length-1, 1)];
    
    [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];
    }

}

+(BOOL)resolveInstanceMethod:(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
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    EOCAutoDictionary *dict = [EOCAutoDictionary new];
    dict.date = [NSDate dateWithTimeIntervalSince1970:475372800];
    NSLog(@"%@",dict.date);
}
相關文章
相關標籤/搜索