iOSキー値符号化(KVC)とキー値傍受(KVO)


KVC
setterメソッドとgetterメソッドに加えて、オブジェクトのプロパティを設定および変更し、ポイント構文を簡略化します.ocはまた、key value coding(略称KVC)と呼ばれる文字列形式でオブジェクトの属性を間接的に操作することを可能にする、より柔軟な操作方式を提供する.すなわち、キー値符号化である.
最も基本的な2つの操作:
setValue:属性値forKey:属性名指定属性付与
valueForKey:指定した属性の値を取得する属性名
#import <Foundation/Foundation.h>

@interface MineKvc : NSObject

@property (nonatomic,copy) NSString * name ;
@property (nonatomic,copy) NSString * pass ;
@property (nonatomic,copy) NSDate * birth  ;
@end
#import <Foundation/Foundation.h>
#import "MineKvc.h"

int main(int argc, const char * argv[]) {
 
    MineKvc * myKvc = [[MineKvc alloc]init];
    [myKvc setValue:@"Pudege" forKey:@"name"];
    [myKvc setValue:@"2015" forKey:@"pass"];
    [myKvc setValue:[[NSDate alloc]init] forKey:@"birth"];
    
    NSLog(@"%@--%@--%@",[myKvc valueForKey:@"name"],[myKvc valueForKey:@"pass"],[myKvc valueForKey:@"birth"]);
    
    
}

setValue:forKey:コードの下位メカニズムは次のとおりです.
1.属性を優先的に呼び出すsetName:
2.setterメソッドがない場合、KVCは検索します.nameのメンバー変数、どこで定義しても、KVCペア_nameメンバー変数の割り当て.
3.1と2がない場合、KVCはname変数を検索し、どこで定義しても、KVCはnameメンバー変数に値を付与します.
4.上記3つが見つからない場合は、そのオブジェクトのsetValue:forUndefinedKeyを実行します.
valueForKeyは同じです.
コード実装は次のとおりです.
#import <Foundation/Foundation.h>

@interface MineKvc : NSObject
{
    @package
    NSString * kvc ;
    NSString * _kvc ;
}
@property (nonatomic,copy) NSString * name ;
@property (nonatomic,copy) NSString * pass ;
@property (nonatomic,copy) NSDate * birth  ;

@end
@implementation MineKvc
{
    int imkvc;
}
#import <Foundation/Foundation.h>
#import "MineKvc.h"

int main(int argc, const char * argv[]) {
 
    MineKvc * myKvc = [[MineKvc alloc]init];
    [myKvc setValue:@"Pudege" forKey:@"name"];
    [myKvc setValue:@"2015" forKey:@"pass"];
    [myKvc setValue:[[NSDate alloc]init] forKey:@"birth"];
    
    NSLog(@"%@--%@--%@",[myKvc valueForKey:@"name"],[myKvc valueForKey:@"pass"],[myKvc valueForKey:@"birth"]);
    
    
    
    [myKvc setValue:@"KVC" forKey:@"kvc"];
    NSLog(@"_kvc= %@",myKvc->_kvc);
    NSLog(@"kvc = %@",myKvc->kvc);
    
    
    [myKvc setValue:@"implementation" forKey:@"imkvc"];
    NSLog(@"%@",[myKvc valueForKey:@"imkvc"]);
    
}

2015-07-28 11:46:28.679 KVC[1879:63384] Pudege--2015--2015-07-28 03:46:28 +0000
2015-07-28 11:46:28.680 KVC[1879:63384] _kvc= KVC
2015-07-28 11:46:28.680 KVC[1879:63384] kvc = (null)
2015-07-28 11:46:28.680 KVC[1879:63384]0上記の知識点に加えてundefinedKeyを書き換える2つの方法に注意し、コンパイラの放出異常を防止します.
KVCでintなどの単純なデータ型にnilを割り当てるには、setNilValueForKey:を書き換える必要があります.
キーパス
オブジェクトの複合プロパティ、すなわちKVCのKeyパス.オブジェクトにはPudgeタイプのpudge属性が含まれ、Pudgeタイプにはname属性が含まれているので、KVCはpudgeを通過する.nameというKeyパスは値を付与します.
setValue:forKeyPath;
valueForKeyPath;
KVO
kvoメカニズムNSKeyValueObservingプロトコルは、NSObjectがこのプロトコルに従うサポートを提供します.よくある方法:
addObserver:forKeyPath:options:context指定したkeyパスをリスニングするリスナーを登録する
removeObserver:forKeyPath:keyパスの削除のためのリスナーの指定
removeObserver
:
forKey
Path              
同様に、コンテキストcontextを追加
このメソッドを書き換えると、リスニングされたデータモデルが変更されると、リスナーのメソッドがコールバックされます.
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context