2013-01-20 2 views
1

iOS 문서에서 KVC 준수를 읽을 때. 나는 수업을 시험하려고 노력했다. KVC 클래스는 준수합니까?KVC 준수 클래스

는하지만 몇 가지 질문이 있습니다 속성 "이름", "나이"에 대한

  1. 아니 세터를하고, 클래스는 여전히 오류 없이 KVC를 사용하고도 예외는

  2. 해고되지 않습니다 속성을위한 세터가 생성되지 않으면 컴파일러는 무엇을합니까? 그것은 setter와 getter 쌍을 생성합니까? 10 : 나이 :

    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"]]; 
    } 
    

나는 결과가 버튼을 누르면 이름 : Duc Nguyen. 이 경우 클래스가 KVC를 어떻게 사용할 수 있는지 이해할 수 없습니까?

답변

4

대답은 Accessor Search Patterns for Simple Attributes KVC 가이드에 나와 있습니다. setValue에 대한

기본 검색 패턴 : forKey :

  1. 수신기의 클래스가 검색됩니다 : setValue:forKey:의 기본 구현은 다음의 검색 패턴이 사용되는 속성에 대한 호출

    이름이 패턴 set<Key>:와 일치하는 접근 자 메서드.

  2. 더 접근이 발견되지 않는 경우
  3. YES를 반환 accessInstanceVariablesDirectly 수신기의 클래스 메소드는, 수신기는 이름이 순서대로 패턴 _<key>, _is<Key>, <key>, 또는 is<Key>을 일치하는 인스턴스 변수를 검색합니다.

기본 구현은 KVC기구 실제로 nameage과 인스턴스 변수의 값을 얻고, 그래서 accessInstanceVariablesDirectly 방법 YES 반환한다.

+3

이런 이유로 모든 사용자 지정 클래스에 대해 'NO'를 반환하려면 '+ accessInstanceVariablesDirectly'를 재정의하는 것이 좋습니다. KVC가 인스턴스 변수에 직접 액세스하는 방식은 캡슐화의 끔찍한 위반이며 오류를 숨 깁니다. –