前言
進(jìn)階三回顧前兩篇文章,共分兩部分。第一部分寫(xiě)個(gè)奇怪的小程序,用來(lái)說(shuō)明KVO的監(jiān)聽(tīng)和被監(jiān)聽(tīng)對(duì)象的可變性,第二部分接著上篇寫(xiě)KVO的依賴(lài)設(shè)置
正文
part 1
這部分直接貼代碼,有疑問(wèn)的地方歡迎提問(wèn)(內(nèi)部有循環(huán)引用沒(méi)有解除)

Bridge

Person

Main
part 2
進(jìn)階二中提到過(guò)KVO的內(nèi)部通知,很容易想到是否可以在某個(gè)方法中設(shè)置多個(gè)屬性通知從而達(dá)到依賴(lài)的目的。

Observer.png

Person.h

Person.m

Main
其實(shí)如果進(jìn)入Foundation/NSKeyValueObserving.h中可以發(fā)現(xiàn)這么個(gè)方法
+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key
這里可以直接實(shí)現(xiàn)KVO的依賴(lài)。把Person.m中的兩個(gè)setter干掉,然后代碼這樣寫(xiě)
+ (NSSet<NSString *> *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"fullName"]) {
NSArray *affectingKeys = @[@"givenName", @"familyName"];
keyPaths = [keyPaths setByAddingObjectsFromArray:affectingKeys];
}
return keyPaths;
}
再來(lái)看一次運(yùn)行結(jié)果

Main