2008-12-26 11 views
5

Esta pregunta ha surgido de este one. Trabajar con listas de estructuras en cocoa no es simple. Utilice NSArray y codifique/decodifique, o use una matriz tipo C y pierda los productos de NSArray. Se supone que las estructuras son simples, pero cuando se necesita una lista, uno tiende a construir una clase en su lugar.¿Usar listas de estructuras tiene sentido en el cacao?

¿Cuándo tiene sentido usar listas de estructuras en el cacao?

Sé que ya hay muchas preguntas con respecto a las estructuras frente a las clases, y he leído que los usuarios afirman que es la misma respuesta para todos los idiomas, pero al menos el cacao debería tener sus propias respuestas específicas, aunque solo sea por KVC o enlaces (como sugirió Peter en la primera pregunta).

+0

KVC y vinculaciones no son las dos únicas razones para hacer de algo un objeto. Entre los otros está poder ponerlo en un objeto de colección sin tener que box/unbox. También puede probar fácilmente si algo es un objeto de ese tipo, algo que no es posible con las estructuras. –

Respuesta

11

Cocoa tiene algunos tipos comunes que son estructuras, no objetos: NSPoint, NSRect, NSRange (y sus homólogos de CG).

En caso de duda, siga la iniciativa de Cocoa. Si te encuentras lidiando con una gran cantidad de objetos pequeños, en su mayoría de datos, es posible que desees construirlos en lugar de eficiencia.

El uso de NSArray/NSMutableArray como el contenedor de nivel superior, y envolviendo las estructuras en un NSValue probablemente hará su vida mucho más fácil. Solo iría a una matriz recta tipo C si encuentra que NSArray es un cuello de botella de rendimiento, o posiblemente si la matriz es esencialmente de solo lectura.

1

En general, el uso de una estructura implica la existencia de un tipo de datos relativamente simple que no tiene lógica asociada ni debe tener ninguna lógica asociada. Tome un NSPoint por ejemplo - es meramente una representación (x, y). Dado esto, también hay algunos problemas que surgen de su uso. En general, esto está bien para este tipo de datos, ya que generalmente observamos un cambio en el punto en lugar de la coordenada y de un punto (fundamentalmente, (0,1) no es lo mismo que (1,1) desplazado abajo por 1 unidad). Si esto es un comportamiento indeseable, puede ser una mejor idea usar una clase.

2

A veces es conveniente y útil usar estructuras, especialmente cuando tiene que bajar a C, como cuando se trabaja con una biblioteca existente o cuando se trata de cosas a nivel de sistema. A veces solo quieres una estructura de datos compacta sin la sobrecarga de una clase. Si necesita muchas instancias de tales estructuras, puede tener un impacto real en el rendimiento y la huella de memoria.

Otra forma de hacer una serie de estructuras es utilizar la clase NSPointerArray. Se necesita un poco más de tiempo para configurarlo, pero funciona más o menos como un NSArray después de eso y no tienes que preocuparte por boxear/desempaquetar o envolver en una clase, por lo que acceder a los datos es más conveniente, y no funciona. tomar el recuerdo extra de una clase.

NSPointerFunctions *pf = [[NSPointerFunctions alloc] initWithOptions:NSPointerFunctionsMallocMemory | 
          NSPointerFunctionsStructPersonality | 
          NSPointerFunctionsCopyIn]; 
pf.sizeFunction = keventSizeFunction; 
self.pending = [[NSPointerArray alloc] initWithPointerFunctions:pf]; 
+0

Para las personas que usan el SDK de iPhone: NSPointerArray no está disponible para el iPhone. – Felixyz

+2

NSPointerArray está disponible en iPhone en iOS 6.0 + – afarnham

Cuestiones relacionadas