1、观察私有属性?
结合kvc;
2、手动实现?
*对象属性set方法重写前后分别调用willChangeValueForKey、didChangeValueForKey;
*当key为属性字符串时,关闭自动通知,automaticallyNotifiesObserversForKey;
3、手动实现源码:
1 viewcontroller
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//kvo
self.object1 = [[KVOObject alloc] init];
[self.object1 addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];
self.object1.name = @"lcx";
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
}
2 #import "KVOObject.h"
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface KVOObject : NSObject
@property (nonatomic, copy ) NSString *name;
@end
NS_ASSUME_NONNULL_END
3 #import "KVOObject.h"
#import "KVOObject.h"
#import <objc/runtime.h>
static NSString *const nameKey = @"name";
@implementation KVOObject
- (void)setName:(NSString *)name{
if (![_name isEqualToString:nameKey]) {
[self willChangeValueForKey:nameKey];
_name = name;
[self didChangeValueForKey:nameKey];
NSLog(@"监听了");
}
}
+ (BOOL)automaticallyNotifiesObserversForKey:(NSString *)key{
if ([key isEqualToString:nameKey]) {
return NO;
}
return [super automaticallyNotifiesObserversForKey:key];
}