IOS學習之初識KVC

總李寫程式碼發表於2016-05-17

什麼是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"]);

 

相關文章