1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- //
- // NSCache+BlocksKit.m
- // BlocksKit
- //
- #import "A2DynamicDelegate.h"
- #import "NSCache+BlocksKit.h"
- #import "NSObject+A2BlockDelegate.h"
- #pragma mark Custom delegate
- @interface A2DynamicNSCacheDelegate : A2DynamicDelegate <NSCacheDelegate>
- @end
- @implementation A2DynamicNSCacheDelegate
- - (void)cache:(NSCache *)cache willEvictObject:(id)obj
- {
- id realDelegate = self.realDelegate;
- if (realDelegate && [realDelegate respondsToSelector:@selector(cache:willEvictObject:)])
- [realDelegate cache:cache willEvictObject:obj];
- void (^orig)(NSCache *, id) = [self blockImplementationForMethod:_cmd];
- if (orig) orig(cache, obj);
- }
- @end
- #pragma mark Category
- @implementation NSCache (BlocksKit)
- @dynamic bk_willEvictBlock;
- + (void)load
- {
- @autoreleasepool {
- [self bk_registerDynamicDelegate];
- [self bk_linkDelegateMethods:@{ @"bk_willEvictBlock": @"cache:willEvictObject:" }];
- }
- }
- #pragma mark Methods
- - (id)bk_objectForKey:(id)key withGetter:(id (^)(void))block
- {
- id object = [self objectForKey:key];
- if (object) return object;
- if (block) {
- object = block();
- [self setObject:object forKey:key];
- }
- return object;
- }
- @end
|