iOS KVOの基本使用

3927 ワード

  • KVO:(Key-Value-Observer)キー値観察者は、観察者設計モードの具体的な実装(C層とM層の通信)
  • である.
  • KVOトリガメカニズム:1つのオブジェクト(オブザーバ)は、別のオブジェクト(オブザーバ)のある属性が変化したかどうかを検出し、モニタリングされた属性が変更されると、オブザーバの1つのメソッド(メソッド名が固定され、エージェントメソッドに類似)
  • をトリガする.
  • 使用手順:
  • 登録観察者(観察されるために観察者および観察者の属性を指定する)
  • .
  • コールバック方法
  • を実現する
  • トリガコールバック方法
  • 観察者
  • を除去する.
  • 一般KVOが潰れる原因:
  • 観察されたオブジェクトは破棄された(観察されたオブジェクトは局所変数である)
  • 観察者は解放されたが、傍受(例えば、モード押し出し、push、popなど)
  • は除去されなかった.
  • に登録された傍受は削除されず、再び傍受
  • に登録された.
  • の具体的な実現過程は以下の通りである:(ここではPerson類のname属性の観察である)Person.hファイル
  • @interface Person : NSObject 
    @property(nonatomic,strong)NSString *name;//   
    //          
    - (void)changeName:(NSString*)name; 
    //         
    - (void)changeNameFromSetter:(NSString*)name; 
    @end
    

    Person.mファイル
    #import "Person.h" 
    @implementation Person 
    //          
    - (void)changeName:(NSString*)name{ 
        _name = name; 
    } 
    //         
    - (void)changeNameFromSetter:(NSString*)name { 
        self.name = name; 
    } 
    @end
    

    rootViewController.mファイル
    #pragma mark -    person 
    - (void)initPerson{ 
        self.person = [[Person alloc] init]; 
        self.person.name = @"     "; 
    } 
     
     
    #pragma mark -      
    - (void)changeColor { 
    //    self.view.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1]; 
        self.view.backgroundColor = [UIColor redColor]; 
    }
    

    1.登録観察者
    //observer    (  self.view        ) 
        //KeyPath:          
        //options:        ,        (   ) 
        //context:       kvo        
        //   self.view      
        //     (     ) 
        /* 
         options:  4  ,   : 
     
           NSKeyValueObservingOptionOld                
     
           NSKeyValueObservingOptionNew                
     
           NSKeyValueObservingOptionInitial              ,    ,        。        ,       。 
     
           NSKeyValueObservingOptionPrior  2   。            。 
         */ 
        [self.person addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld context:nil];
    

    2.コールバックの実現方法
    #pragma mark - kvo     (         ) 
    //keyPath:     
    //object:       
    //change:          change    
    //context:        ,context       
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { 
        id oldName = [change objectForKey:NSKeyValueChangeOldKey]; 
        NSLog(@"oldName----------%@",oldName); 
        id newName = [change objectForKey:NSKeyValueChangeNewKey]; 
        NSLog(@"newName-----------%@",newName); 
        //         ,  kvo 
    //    [object removeObserver:self forKeyPath:@"name"]; 
    }
    

    3.コールバックメソッドをトリガーする(ここでは、Person.mファイルでsetterメソッドまたはkvcを経由しない場合、例えば(_name=name)この場合kvcのコールバックメソッドはトリガーされません.つまり、コールバックメソッドをトリガーするには、setterメソッドまたはKVCを経由して値を割り当てる必要があります)
    //       
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"   " style:UIBarButtonItemStylePlain target:self action:@selector(oldAction)]; 
        //       
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"   " style:UIBarButtonItemStylePlain target:self action:@selector(newAction)];
    
    #pragma mark -        (        setter     kvc,  (_name = @"  "),        kvc     ) 
    //       (        ) 
    - (void)oldAction { 
        [self.person changeName:@"  "]; 
    } 
    //        
    - (void)newAction { 
        [self.person changeNameFromSetter:@"  "]; 
    }
    

    4.観察者を除去するには、2つの方法があります.1つ目は、インタフェースが消えるときにKVOを除去することです.
        //         ,  kvo 
        [object removeObserver:self forKeyPath:@"name"];
    
    - (void)dealloc { 
        [self.person removeObserver:self forKeyPath:@"name"]; 
        self.person = nil; 
    }