2011-01-28 3 views
6

NSObject에서 상속 한 클래스가 있습니다. NSMutableArray를 사용하여 자식 객체 (예 : Person 객체를 저장하기 위해 NSMutableArray * 항목을 사용하는 사람들. 항목에 NSFastEnumerator를 구현하려면 어떻게해야합니까?사용자 정의 클래스에 NSFastEnumeration 구현

나는 시도 다음 그러나 그것은 잘못되었습니다

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len 
{ 
    if(state->state == 0) 
    { 
     state->mutationsPtr = (unsigned long *)self; 
     state->itemsPtr = items; 
     state->state = [items count]; 
     return count; 
    } 
    else 
     return 0; 
} 
+0

무엇입니까 당신이하려고? [array count]를 사용하면 어레이의 특정 유형의 객체 수를 얻으려는 경우 (배열의 id 객체) <= 빠른 열거 형인 –

+0

인스턴스 내 애플 리케이션 클래스 내 인스턴스에서이 일을 할 수 있다고 가정 해 봅시다 : for (Person * p in People) { NSLog (p); } – user593733

답변

18

NSFastEnumerationState 구조를 올바르게 사용하고 있지 않습니다. NSFastEnumeration Protocol Reference을 참조하고 각 필드에 대한 설명을 보려면 상수 섹션을보십시오. 귀하의 경우에는 state->mutationsPtr을 nil로 남겨 두어야합니다. state->itemsPtr은 NSArray 또는 NSMutableArray가 아니라 개체의 C- 배열로 설정해야합니다. 또한 stackbuf로 전달 된 배열에 동일한 객체를 넣어야합니다. 그러나

, 당신은 당신이 열거 된 개체를 포함하는있는 NSMutableArray를 사용하고 있기 때문에, 당신은 단지 그 객체에 호출을 전달할 수 :

- (NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id *)stackbuf count:(NSUInteger)len { 
    return [items countByEnumeratingWithState:state objects:stackbuf count:len]; 
} 
+2

'그 객체에 대한 호출을 전달하면됩니다.'왜 내가 그렇게 생각하지 않았습니까? 감사! – user593733

+0

* mutationsPtr 값이 호출자에 의해 캐시되지 않습니까? \t 더 안전 할 것입니다 state-> mutationsPtr = & state-> extra [0]; NULL을 무시하지 않는 경우. –

1

NSFastEnumeration 프로토콜있다,하지만 당신은 (존재하지 않는) NSFastEnumerator 프로토콜을 사용하는 ...

@interface People : NSObject <NSFastEnumeration> 
{ 
    NSMutableArray *items; 
} 

@implementation . 그것이 문제일까요?

+0

내 응용 프로그램 대리인의 People 클래스에 대한 인스턴스가 있습니다.이 작업을 수행 할 수있게하려고합니다. for (Person * p in People) { NSLog (p); } – user593733

관련 문제