setValue:屬性值 forKey:屬性名: 為指定屬性設置值
valueForKey:屬性名: 獲取指定屬性的值
[p setValue:@"小麥" forKey:@"_name"];
NSLog(@"%@",p.name);
KVC setValue: forKey: 執(zhí)行機制:
1.優(yōu)先考慮調用“setName:屬性值;” 代碼通過setter 方法完成設置
2.如果沒有setName KVC搜索該類名為_name的成員變量瓷们,無論該成員變量實在類接口部分定義揽思,還是在類實現(xiàn)部分定義樟氢,也無論用哪個訪問控制符修飾,這條KVC代碼底層實際上就是對_name成員變量賦值
3.若1 2 皆無 搜索名為name,無論該成員變量實在類接口部分定義怪嫌,還是在類實現(xiàn)部分定義梆靖,也無論用哪個訪問控制符修飾漆改,這條KVC代碼底層實際上就是對name成員變量賦值
4.1 2 3 都沒有找到 執(zhí)行該對象的setValue:forUndefinedKey:,此方法的默認執(zhí)行是為了引發(fā)一個稱為 NSUnknownKeyException的異常
valueforKey@"name"底層執(zhí)行機制:
1.優(yōu)先getter方法
2.否則搜索類名為_name的成員變量蒲跨,如set...般不考慮權限
3.否則搜索name
4.否則執(zhí)行valueforUndefinedKey:方法
NSUnknownKeyException方法的重寫,不需要聲明蟹地。//設置部分
-(void) setValue:(id) value forUnderfinedKey: (id) Key{
//自定義語句
}
-(void)valueForUndefinedKey:(id)key{
//自定義語句
}
OC中并不存在絕對隱藏的方法积暖,既是一個方法僅僅在類實現(xiàn)部分定義,類接口部分沒有定義怪与,也可通過NSObject提供的performSelector:或 performSelector:withObject:方法調用夺刑。
KVC處理nil值:
int 等類型無法接受nil 可以重寫setNilValueForKey:方法
-(void) setNilValueForKey:(id)key
{
//自定義語句
[super setNulValueForKey: key];
}
Key路徑:
除了操作對象的屬性之外,還可操作對象的"符合屬性" ?所謂“復合屬性“分别,KVC機制將其稱為Key路徑遍愿,比如
為實例提供直接操作類屬性成員變量中的成員變量
setValue:forKeyPath: 根據(jù)Key路徑設置屬性名
valueForKeyPath: 根據(jù)Key路徑獲取屬性值 設置復合屬性時,需要用到ForKeyPath而不是ForKeyPath
[u setValue:[[FKPreson alloc] init] forKey:@"p"];//使用的時候要把類對象初始化
[u setValue:@"小麥" forKeyPath:@"p.name"];
NSLog(@"%@",[u valueForKeyPath:@"p.name"]);
性能比setter getter差茎杂,但是靈活性高错览。