2011-01-28 15 views
6

Tengo una clase que hereda de NSObject. Utiliza un NSMutableArray para contener objetos secundarios, p. Personas que usan elementos NSMutableArray * para contener objetos Person. ¿Cómo implemento NSFastEnumerator en los artículos?Implementación de NSFastEnumeration en la clase personalizada

he intentado lo siguiente pero no es válido:

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

@implementation ...

- (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

Qué es lo que usted está tratando de hacer? Si solo usa [array count], puede obtener el conteo ya, si desea obtener el conteo de ciertos tipos de objetos en la matriz que debe usar para (id id in array) <= que es una enumeración rápida –

+0

Tengo una instancia en mi clase de personas en mi delegado de aplicación digamos que quiero poder hacer esto: para (Persona * p en Personas) { NSLog (p); } – user593733

Respuesta

18

No está utilizando correctamente la estructura NSFastEnumerationState. Consulte NSFastEnumeration Protocol Reference y mire la sección de constantes para ver una descripción de cada uno de los campos. En su caso, debe dejar state->mutationsPtr como nulo. state->itemsPtr se debe establecer en una matriz C de los objetos, no en un NSArray o NSMutableArray. También necesita colocar los mismos objetos en la matriz pasada como stackbuf.

Sin embargo, dado que está utilizando un NSMutableArray para contener los objetos que está enumerando, sólo podría desviar la llamada a ese objeto:

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

'solo reenvía la llamada a ese objeto' Ahora bien, ¿por qué no pensé en eso? ¡Gracias! – user593733

+0

¿El caché no almacenaría en memoria caché el valor * mutationsPtr? \t Sería más seguro declarar-> mutacionesPtr = & state-> extra [0]; si no está ignorando NULL. –

1

Hay un protocolo NSFastEnumeration, pero que está utilizando la (inexistente) NSFastEnumerator protocolo . ¿Podría ser el problema?

+0

Tengo una instancia en mi clase People en mi delegado de aplicación digamos que quiero poder hacer esto: for (Person * p in People) { NSLog (p); } – user593733

Cuestiones relacionadas