2010-04-03 3 views
2
arr = [[NSMutableArray alloc]init]; 
[arr addObject:[NSNumber numberWithInt:4]]; 
[arr addObject:[NSNumber numberWithInt:45]]; 
[arr addObject:[NSNumber numberWithInt:23]]; 
[arr addObject:[NSNumber numberWithInt:12]]; 
NSLog(@"The avg = %@", [arr valueForKeyPath:@"@avg.intValue"]); 

이 코드는 정상적으로 작동하지만 왜 작동합니까? valueForKeyPath:@"@avg.intValue"이 각 NSNumber에서 (int)를 요청하고 있지만 로그에 % @ 문자열을 출력하고 있습니다. 만약 내가 십진법 % d를 출력하려고하면 아마도 포인터가 뭔가있는 숫자를 얻습니다. 누군가가 @avg 연산자를 호출 할 때 정수가 NSNumber가되는 이유를 설명 할 수 있습니까?목표 c 키 경로 연산자 @ avg, @max

답변

1

valueForKeyPath: 당신이 얻을 수 있도록의 NSNumber 또는 NSValue (나는 확실하지 않다, (그것의 반환 형식은 id입니다) 결과가 intValue에도 불구하고 개체에 다시 묶이는 방식). 컬렉션에 비 오브젝트를 저장할 수없는 것과 같은 이유입니다.

1

@avg 연산자는 NSNumber 인스턴스를 반환합니다. %d을 사용하는 경우 NSNumber 인스턴스의 메모리 주소를 인쇄합니다. 반면에 %@을 사용하면 NSNumber 인스턴스에 description 메시지가 전송되고 결과로 NSString이 인쇄됩니다.

@avg 및 기타 운영자에 대한 자세한 내용은 Key-Value Coding Programming GuideSet and Array Operators을 참조하십시오. 그것은 intValue가 INT 또는의 NSNumber를 제공하고 있는지 여부에 따라 달라집니다 (이전의 경우); 객체를 반환해야합니다