NSCache+BlocksKit.m 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. //
  2. // NSCache+BlocksKit.m
  3. // BlocksKit
  4. //
  5. #import "A2DynamicDelegate.h"
  6. #import "NSCache+BlocksKit.h"
  7. #import "NSObject+A2BlockDelegate.h"
  8. #pragma mark Custom delegate
  9. @interface A2DynamicNSCacheDelegate : A2DynamicDelegate <NSCacheDelegate>
  10. @end
  11. @implementation A2DynamicNSCacheDelegate
  12. - (void)cache:(NSCache *)cache willEvictObject:(id)obj
  13. {
  14. id realDelegate = self.realDelegate;
  15. if (realDelegate && [realDelegate respondsToSelector:@selector(cache:willEvictObject:)])
  16. [realDelegate cache:cache willEvictObject:obj];
  17. void (^orig)(NSCache *, id) = [self blockImplementationForMethod:_cmd];
  18. if (orig) orig(cache, obj);
  19. }
  20. @end
  21. #pragma mark Category
  22. @implementation NSCache (BlocksKit)
  23. @dynamic bk_willEvictBlock;
  24. + (void)load
  25. {
  26. @autoreleasepool {
  27. [self bk_registerDynamicDelegate];
  28. [self bk_linkDelegateMethods:@{ @"bk_willEvictBlock": @"cache:willEvictObject:" }];
  29. }
  30. }
  31. #pragma mark Methods
  32. - (id)bk_objectForKey:(id)key withGetter:(id (^)(void))block
  33. {
  34. id object = [self objectForKey:key];
  35. if (object) return object;
  36. if (block) {
  37. object = block();
  38. [self setObject:object forKey:key];
  39. }
  40. return object;
  41. }
  42. @end