2010-02-25 3 views
3

저는 키 값 코딩과 to-many 관계와 혼동됩니다. 나는 그러한 관계를 가질 때 [object mutableArrayValueForKey : @ "key"];를 사용해야한다고 읽었습니다. 해당 순서 관계로 오브젝트를 보유하는 변경 가능한 배열을 검색하십시오.키 - 값 코딩과 to-many 관계

mutableArrayValueForKey의 차이점은 무엇입니까? 아니면 valueForKey의 차이점은 무엇입니까?

날 (배열 속성으로 자동 설정의있는 NSMutableArray입니다) 예와 함께 설명 보자

id array1= [self valueForKey:@"array"]; 

NSLog(@"first element %@",[array1 objectAtIndex:1]); 

id array2 = [self mutableArrayValueForKey:@"array"]; 

NSLog(@"first element %@",[array2 objectAtIndex:1]); 

두 호출이 동일 돌아갑니다. 이 경우 두 번째 혜택의 이점 또는 다른 점은 무엇입니까?

건배!

답변

6

mutableArrayValueForKey "array"를 반환하지 않으면 "array"에 대한 프록시를 반환합니다.

NSLog(@"%@", [self.array class]); 
NSLog(@"%@", [[self valueForKey:@"array"] class]); 
NSLog(@"%@", [[self mutableArrayValueForKey:@"array"] class]); 

이 인쇄 :

2010-02-24 20:06:44.258 Untitled[25523:a0f] NSCFArray 
2010-02-24 20:06:44.275 Untitled[25523:a0f] NSCFArray 
2010-02-24 20:06:44.276 Untitled[25523:a0f] NSKeyValueSlowMutableArray 

읽기를 documentation 이상 mutableArrayValueForKey에 대한 자세한 내용은 프록시가 작동하는 방법에 당신이 클래스를 인쇄하는 경우이를 볼 수 있습니다. 이 특별한 경우에는 실제 NSMutableArray를 ivar로 사용하게됩니다. 그런 아이어가 없다면 어떨까요? countOf<Key>objectIn<Key>AtIndex:과 같은 방법으로 속성을 백업하는 KVC를 구현할 수 있습니다. KVC 방법에 합리적인 결과를 반환 할 수있는 한 실제 "배열"ivar이 있다는 규칙은 없습니다.

하지만 NSMutableArray 인터페이스를 표시하고 싶지만 실제 NSMutableArray가 없으면 어떻게해야합니까? 그것이 mutableArrayValueForKey을위한 것입니다. 그것은 접근 할 때 insertObject:in<Key>AtIndex:과 같은 다단계 to-many 메쏘드를 보내는 것을 포함하여, 접근 할 때 KVC 메쏘드로 변환 할 프록시를 반환합니다.

실제 ivar을 사용하는 경우에도 마찬가지입니다 (예를 들어). 프록시가 실제 개체와 매우 비슷하게 작동하기 때문에 사용자가 인식하지 못합니다.

+0

자세히 설명해 주셔서 감사합니다! – dreamlax

+0

대답 해 주셔서 감사합니다! – theprole

0

첫 번째 요소는 실제로 objectAtIndex:0이며 objectAtIndex:1이 아닙니다.

또한 addObject:removeObjectAtIndex:으로 반환 된 배열을 수정할 수 있습니다. @"array"의 값이 불변의 배열 인 경우에도 마찬가지입니다.

+0

예 첫 번째 요소가 0임을 압니다. 코드가 첫 번째 요소라는 것을 의미하지는 않습니다. 두 번째 요점은 의미가 있지만 유일한 이점입니까? 그것은 가변 배열을 반환합니까? 왜 (원래 객체가 NSMutableArray 인 경우) valueForKey가 변경 가능한 객체를 반환하지 않습니까? – theprole

+0

게다가, 당신이 (NSMutableArray *) 배열을 작성한다면; 메서드를 호출하면 NSMutableArray를 반환하고 첫 번째 호출은 실제로 변경 가능한 배열을 가져옵니다. 따라서 addObject를 사용할 수 있습니다 : – theprole

+3

NSLog (@ "첫 번째 요소 % @", ...) '다음 * 초 * 요소를 기록합니다. – dreamlax