iOS-KVC(一)基本使用
iOS-KVC(二)內(nèi)部賦值深層次原理
iOS-KVC(三)內(nèi)部取值深層次原理
iOS-KVC(四)常見(jiàn)異常處理
iOS-KVC(五)容器類
iOS-KVC(六)正確性驗(yàn)證
iOS-KVC(七)字典相關(guān)
iOS-KVC(八)常見(jiàn)使用
主要涉及到的這個(gè)方法
- (nullable id)valueForKey:(NSString *)key;
KVC對(duì)key的搜索方式不同于之前說(shuō)的賦值做粤。
當(dāng)用以上方法時(shí)候,底層的執(zhí)行機(jī)制如下
首先按-get<Key>, -<key>, -is<Key> 這個(gè)順序查找相關(guān)方法雇锡,找到的話會(huì)直接調(diào)用。
如果返回值的類型是對(duì)象的話,就直接返回;
如果是BOOL或者Int等值類型, 會(huì)將其包裝成一個(gè)NSNumber對(duì)象返回;
其他的就包裝成NSValue對(duì)象返回椎眯。如果上面的getter沒(méi)有找到,KVC則會(huì)查找
-countOf<Key>, -objectIn<Key>AtIndex:或-<key>AtIndexes:
格式的方法讹开。如果countOf<Key>方法和另外兩個(gè)方法中的一個(gè)被找到盅视,那么就會(huì)返回一個(gè)可以響應(yīng)NSArray所有方法的代理集合(它是NSKeyValueArray,是NSArray的子類)旦万,調(diào)用這個(gè)代理集合的方法闹击,或者說(shuō)給這個(gè)代理集合發(fā)送屬于NSArray的方法,就會(huì)以
countOf<Key>,-objectIn<Key>AtIndex:或-<key>AtIndexes:
這幾個(gè)方法組合的形式調(diào)用成艘。還有一個(gè)可選的get<Key>:range:方法赏半。所以你想重新定義KVC的一些功能贺归,你可以添加這些方法,需要注意的是你的方法名要符合KVC的標(biāo)準(zhǔn)命名方法断箫,包括方法簽名拂酣。
- 如果上面的方法沒(méi)有找到,那么會(huì)同時(shí)查找
-countOf<Key>仲义,-enumeratorOf<Key>, -memberOf<Key>:
格式的方法婶熬。如果這三個(gè)方法都找到,那么就返回一個(gè)可以響應(yīng)NSSet所的方法的代理集合埃撵,和上面一樣赵颅,給這個(gè)代理集合發(fā)NSSet的消息,就會(huì)以
-countOf<Key>暂刘,-enumeratorOf<Key>, -memberOf<Key>:
組合的形式調(diào)用饺谬。
- 如果還沒(méi)有找到,再檢查類方法
+ (BOOL)accessInstanceVariablesDirectly;
如果返回YES(默認(rèn)行為)谣拣,那么和先前的設(shè)值一樣募寨,會(huì)按_<key>, _is<Key>, <key>, is<Key>的順序搜索成員變量名,這里不推薦這么做森缠,因?yàn)檫@樣直接訪問(wèn)實(shí)例變量破壞了封裝性拔鹰,使代碼更脆弱。如果重寫(xiě)了類方法+ (BOOL)accessInstanceVariablesDirectly返回NO的話辅鲸,那么會(huì)直接調(diào)用
- (id)valueForUndefinedKey:(NSString *)key;
簡(jiǎn)單示例:
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"name = %@", [self valueForKey:@"name"]);
id numbers = [self valueForKey:@"numbers"];
NSLog(@"numbres: %@",NSStringFromClass([numbers class]));
NSLog(@"numbers = %@", numbers);
[self valueForKey:@"abc"];
}
-(NSString *)getName
{
return @"getName";
}
-(NSString *)name
{
return @"name";
}
-(NSString *)isName
{
return @"isName";
}
- (NSInteger)countOfNumbers
{
return 5;
}
- (id)objectInNumbersAtIndex:(NSInteger)index
{
return @(index + 1);
}
- (id)valueForUndefinedKey:(NSString *)key
{
NSLog(@"valueForUndefinedKey, key = %@", key);
return nil;
}
@end
結(jié)果:
2019-06-22 23:28:58.730209+0800 study[10995:169342] name = getName
2019-06-22 23:28:58.730510+0800 study[10995:169342] numbres: NSKeyValueArray
2019-06-22 23:28:58.730724+0800 study[10995:169342] numbers = (
1,
2,
3,
4,
5
)
2019-06-22 23:28:58.730946+0800 study[10995:169342] valueForUndefinedKey, key = abc