NSObject+FBKVOController.m 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /**
  2. Copyright (c) 2014-present, Facebook, Inc.
  3. All rights reserved.
  4. This source code is licensed under the BSD-style license found in the
  5. LICENSE file in the root directory of this source tree. An additional grant
  6. of patent rights can be found in the PATENTS file in the same directory.
  7. */
  8. #import "NSObject+FBKVOController.h"
  9. #import <objc/message.h>
  10. #if !__has_feature(objc_arc)
  11. #error This file must be compiled with ARC. Convert your project to ARC or specify the -fobjc-arc flag.
  12. #endif
  13. #pragma mark NSObject Category -
  14. NS_ASSUME_NONNULL_BEGIN
  15. static void *NSObjectKVOControllerKey = &NSObjectKVOControllerKey;
  16. static void *NSObjectKVOControllerNonRetainingKey = &NSObjectKVOControllerNonRetainingKey;
  17. @implementation NSObject (FBKVOController)
  18. - (FBKVOController *)KVOController
  19. {
  20. id controller = objc_getAssociatedObject(self, NSObjectKVOControllerKey);
  21. // lazily create the KVOController
  22. if (nil == controller) {
  23. controller = [FBKVOController controllerWithObserver:self];
  24. self.KVOController = controller;
  25. }
  26. return controller;
  27. }
  28. - (void)setKVOController:(FBKVOController *)KVOController
  29. {
  30. objc_setAssociatedObject(self, NSObjectKVOControllerKey, KVOController, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  31. }
  32. - (FBKVOController *)KVOControllerNonRetaining
  33. {
  34. id controller = objc_getAssociatedObject(self, NSObjectKVOControllerNonRetainingKey);
  35. if (nil == controller) {
  36. controller = [[FBKVOController alloc] initWithObserver:self retainObserved:NO];
  37. self.KVOControllerNonRetaining = controller;
  38. }
  39. return controller;
  40. }
  41. - (void)setKVOControllerNonRetaining:(FBKVOController *)KVOControllerNonRetaining
  42. {
  43. objc_setAssociatedObject(self, NSObjectKVOControllerNonRetainingKey, KVOControllerNonRetaining, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
  44. }
  45. @end
  46. NS_ASSUME_NONNULL_END