2013-01-20 35 views
1

在iOS文檔中閱讀KVC兼容時。我試圖測試一個班級。 KVC Class是否合規?KVC兼容類

但我有一些問題:

  1. 沒有setter方法的屬性「姓名」,「年齡」,類仍然使用KVC沒有錯誤 ,沒有異常將被解僱

  2. 當沒有爲屬性創建setter時,編譯器會做什麼? 是否創造了一對二傳手和獲得者?

    Person.h

    @interface Person : NSObject 
    { 
        NSString *name; 
        NSInteger age; 
    } 
    

    Person.m

    @implementation Person 
    
    - (id)init 
    { 
        self = [super init]; 
        if (self) { 
         name = @"Duc Nguyen"; 
         age = 10; 
        } 
        return self; 
    } 
    

    ViewController.m

    - (IBAction)showKeyKVC:(id)sender { 
        //--test kvc 
        name1.text = [person valueForKey:@"name"]; 
        age1.text = [NSString stringWithFormat:@"%@", [person valueForKey:@"age"]]; 
    } 
    

當我按下按鈕的結果是:年齡:10,名稱:Duc Nguyen。 我不明白在這種情況下班級如何使用KVC?

回答

4

答案在Accessor Search Patterns for Simple Attributes KVC指南。

爲的setValue默認搜索模式:forKey:

setValue:forKey:默認實現被調用,使用下面的搜索模式的特性:

  1. 接收器的類中搜索一個名稱與模式set<Key>:匹配的訪問方法。
  2. 如果沒有訪問被發現,並accessInstanceVariablesDirectly返回YES接收器的類方法中,接收機中搜索實例變量,其名字的模式,_<key>_is<Key><key>,或is<Key>,按照這個順序相匹配。

默認的實現是YES回到accessInstanceVariablesDirectly方法,所以KVC機制實際上是從nameage實例變量得到的值。

+3

因此,我強烈建議覆蓋'+ accessInstanceVariablesDirectly'來爲所有自定義類返回NO。 KVC直接訪問實例變量的方式是一種可怕的封裝和隱藏錯誤。 –