+ (BOOL)resolveInstanceMethod:(SEL)selector
id autoDictionaryGetter(id self, SEL _cmd);
void autoDictionarySetter(id self, SEL _cmd, id value);
+ (BOOL)resolveInstanceMethod:(SEL)selector
{
NSString *selectorString = NSStringFromSelector(selector);
if (/* selector is from a @dynamic property */)
{
if([selectorString hasPrefix:@“set”])
{
class_addMethod(self, selector, (IMP)autoDictionarySetter, “v@:@“);
}else {
class_addMethod(self, selector, (IMP)autoDictionaryGetter, “@@:“);
}
return YES;
}
return [super resolveInstanceMethod:selector];
}@interface EOCAutoDictionary : NSObject
@property (nonatomic, strong) NSString *string;
@property (nonatomic, strong) NSNumber *number;
@property (nonatomic, strong) NSDate *date;
@property (nonatomic, strong) id opaqueObject;
@property (nonatomic, strong) NSMutableDictionary *backingStore;
@end
@interface EOCAutoDictionary
@dynamic string, number, date, opaqueObject;
- (id)init {
if((self = [super init])){
_backingStore = [NSMutableDictionary new];
}
return self;
}
+ (BOOL)resolveInstanceMethod:(SEL)selector
{
NSString *selectorString = NSStringFromSelector(selector);
if([selectorString hasPrefix:@“set”])
{
class_addMethod(self, selector, (IMP)autoDictionarySetter, “v@:@“);
}else {
class_addMethod(self, selector, (IMP)autoDictionaryGetter, “@@:“);
}
return YES;
}
@endid autoDictionaryGetter (id self, SEL _cmd)
{
// Get the backing store from the object
EOCAutoDictionary *typedSelf = (EOCAutoDictionary*)self;
NSMutableDictionary *backingStore = typedSelf.backingStore;
// The key is simply the selector name
NSString *key = NSStringFromSelector(_cmd);
// Return the value
return [backingStore objectForKey:key];
}void autoDictionarySetter(id self,SEL _cmd, id value)
{
// Get the backing store from the object;
EOCAutoDictionary *typedSelf = (EOCAutoDictionary*)self;
NSMutableDictionary *backingStore = typedSelf.backingStore;
// for “ :setOpaqueObject:” tobe “opaqueObject”
NSString *selectorString = NSStringFromSelector(_cmd);
NSMutableString *key = [selectorString mutableCopy];
[key deleteCharactersInRange:NSMakeRange(key.length - 1, 1)];
[key deleteCharactersInRange:NSMakeRange(0, 3)];
NSString 8lowercaseFistChar = [[key substringToIndex:1] lowercaseString];
[key replaceCharactersInRange:NSMakeRange(0,1) withString:lowercaseFirstChar];
if(value)
[backingStore setObject:value forKey:key];
else
[backingStore removeObjectForKey:key];
}Effective Objective-C 2.0 编写高质量iOS与OS X代码 理解消息转发机制,布布扣,bubuko.com
Effective Objective-C 2.0 编写高质量iOS与OS X代码 理解消息转发机制
原文:http://blog.csdn.net/mad2man/article/details/22309205