什麼是kvc?
kvc (key-value coding )鍵值編碼,是ios 提供的一種通過key間接的來訪問物件屬性的一直方式。
哪些類支援kvc操作?
kvc的操作方法由NSKeyValueCoding協議提供,也就是說只要是這個協議的物件都支援kvc操作。
具體怎麼使用?
動態設定:
setValue:屬性值 forKey:屬性名(用於簡單路徑)
setValue:屬性值 forKeyPath:屬性路徑 比如修改Person物件中Car的品牌 路徑就是(car.brand)
動態讀取:
valueForKey:屬性名
valueForKeyPath:屬性名(用於複合路徑)
具體寫個測試程式看下:
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject { @private NSString *address; } @end
Person.m
#import "Person.h" #import "Car.h" @interface Person () @property (nonatomic ,strong) NSString *name; @property (nonatomic,strong)Car *car; @end @implementation Person -(id)init { self=[super init]; if(self){ self =[super init]; self.car=[[Car alloc]init]; } return self; } @end
Car.h
#import <Foundation/Foundation.h> @interface Car : NSObject @end
Car.m
#import "Car.h" @interface Car() @property (nonatomic ,strong) NSString *brand; @end @implementation Car @end
上述是就是本知識點的測試程式,我全部寫的都是私有變數,我個人覺得用這種kvc機制去修改一個公有屬性是一件完全沒有意義的事情,直接不賦值不挺好?沒必要繞這麼一圈吧?可能我初學乍道,有別的原因希望有人能告訴我!
直接看具體測試:
[self.person setValue:@"zhejiang" forKey:@"address"]; [self.person setValue:@"whoislcj" forKey:@"name"]; [self.person setValue:@"aodi" forKeyPath:@"car.brand"]; NSLog(@"person.name ---->%@",[self.person valueForKey:@"name"]); NSLog(@"person.address ---->%@",[self.person valueForKey:@"address"]); NSLog(@"person.car.name ---->%@",[self.person valueForKeyPath:@"car.brand"]);