iOS - KVC

KVC-鍵值編碼
KVC:對(duì)象取值或者設(shè)置值。
KVO:監(jiān)聽對(duì)象值的變化。

獲取對(duì)象值的優(yōu)先級(jí)

OC對(duì)象的屬性是由3部分組成的,包括成員變量,setter方法,getter方法。
KVC原理圖


image.png

KVC取值優(yōu)先級(jí)

1,查找對(duì)象的相關(guān)方法(getName,name,isName)。
2,看對(duì)象+(BOOL)accessInstanceVariablesDirectly的返回值,YES就查找成員變量,NO就報(bào)異常。
3,成員變量?jī)?yōu)先級(jí)。
例如獲取name的值

PersonModel *model = [[PersonModel alloc]init];
    NSLog(@"%@",[model valueForKey:@"name"]) ;

對(duì)象方法高于成員變量,三個(gè)獲取值的get方法,優(yōu)先級(jí)如下

-(NSString *)getName{
    return @"1111";
}

-(NSString *)name{
    return @"2222";
}
-(NSString *)isName{
    return @"3333";
}

成員變量查找優(yōu)先級(jí)依次如下,只要存在聲明就會(huì)優(yōu)先,不管有沒有值

@interface PersonModel : NSObject{
    NSString *_name;
    NSString *_isName;//注意大寫
    NSString *name;
    NSString *isName;//注意大寫
}

KVC設(shè)值

KVC設(shè)置值優(yōu)先級(jí)和取值類似

1,查找對(duì)象的相關(guān)方法(setKey,setIsName)。
2,看對(duì)象+(BOOL)accessInstanceVariablesDirectly的返回值,YES就查找成員變量,NO就報(bào)異常。
3,成員變量?jī)?yōu)先級(jí),外界可以通過(guò)KVC修改成員變量。
例子,通過(guò)KVC設(shè)置person的name

 PersonModel *person = [[PersonModel alloc]init];
    [person setValue:@"kvo" forKey:@"name"];

相關(guān)方法

-(void)setName:(NSString *)name{
    NSLog(@"setName%@",name);
}
-(void)setIsName:(NSString *)name{
    NSLog(@"setIsName%@",name);
}

知識(shí)點(diǎn)

1,嵌套的拿數(shù)據(jù)方法valueForKeyPath,例如person里的dog的age屬性,依次查找dog和age,查找方法和valueForKey是一樣的。

id age = [person valueForKeyPath:@"dog.age"];

2,找不到成員變量報(bào)異常避免崩潰的方法

-(id)valueForUndefinedKey:(NSString *)key{
    return nil;
}
-(void)setValue:(id)value forUndefinedKey:(NSString *)key{
    NSLog(@"沒有找到%@",key);
} 
-(void)setNilValueForKey:(NSString *)key{
    NSLog(@"不能將%@設(shè)置為nil",key);
}

利用runtime獲取對(duì)象的全部成員變量

/// 獲取對(duì)象全部的成員變量
-(void)getAllProperty{
    unsigned int count = 0;
    //將對(duì)象的成員屬性列表拷貝出來(lái),count引用傳遞,可以拿到對(duì)象成員變量的個(gè)數(shù)
    Ivar *ivars = class_copyIvarList([self class], &count);
    //
    NSMutableArray *arr = [NSMutableArray array];
    
    for (int i = 0; i<count; i++) {
        Ivar ivar = ivars[i];
        const char *name = ivar_getName(ivar);
        NSString *propertyName = [NSString stringWithUTF8String:name];
        [arr addObject:propertyName];
    } 
    
    NSLog(@"\n-----%@的成員變量-----\n%@\n------------------------------",NSStringFromClass([self class]),arr);
    free(ivars);
    
}

KVC的運(yùn)算符

PersonModel *p1 = [[PersonModel alloc]init];
    p1.age = 13;
    PersonModel *p2 = [[PersonModel alloc]init];
    p2.age = 11;
    PersonModel *p3 = [[PersonModel alloc]init];
    p3.age = 15;
    
    NSMutableArray *arr = [NSMutableArray array];
    [arr addObjectsFromArray:@[p1,p2,p3]];
    //KVC的運(yùn)算符,主要針對(duì)數(shù)組,包括@max,@min,@sum,@avg,@count
    NSLog(@"屬性中的最大值是%@",[arr valueForKeyPath:@"@max.age"]);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • KVC是一種通過(guò)字符串的名字(key)來(lái)訪問(wèn)修改類屬性值的機(jī)制。而不是通過(guò)Setter、Getter方法直接訪問(wèn)。...
    zhongli_007閱讀 3,360評(píng)論 0 3
  • 1. Basic methods KVC(Key-value coding)鍵值編碼,就是指iOS的開發(fā)中,可以允...
    木小易Ying閱讀 235評(píng)論 0 4
  • KVC KVC定義 KVC(Key-value coding)鍵值編碼,就是指iOS的開發(fā)中,可以允許開發(fā)者通過(guò)K...
    暮年古稀ZC閱讀 2,291評(píng)論 2 9
  • KVC KVC定義 KVC(Key-value coding)鍵值編碼,就是指iOS的開發(fā)中,可以允許開發(fā)者通過(guò)K...
    jackyshan閱讀 52,313評(píng)論 9 198
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會(huì),身份的轉(zhuǎn)變要...
    余生動(dòng)聽閱讀 10,840評(píng)論 0 11

友情鏈接更多精彩內(nèi)容