Pregunta

Estoy tratando de NSArray subclase, pero se bloquea la aplicación cuando se trata de acceder al método de conteo. Sé que NSArray es un clase racimo .

  • Pero ¿qué significa esto?
  • ¿Hay un trabajo alrededor para poder subclasificar NSArray?

Yo sé que puedo NSObject simplemente subclase y tener mi matriz como una variable de instancia, pero lo haría en lugar NSArray subclase.

EDIT: Razón: Estoy creando un juego de cartas, tengo un Deck clase que debe subclase NSMutableArray tener un par de métodos adicionales (-shuffle, -removeObjects:, -renew, etc.), y creo que se verá más limpio a NSArray subclase en lugar de tener una var.

¿Fue útil?

Solución

El problema con la adición de una categoría en una clase como esta es que todas las instancias de la clase heredarán los métodos adicionales. Es por tanto necesario (ya que no todas las necesidades de la matriz para poder ser barajado, etc.) y peligroso (porque no se puede beneficiar de verificación de tipos para asegurarse que el NSArray Actualmente se está refiriendo a es realmente uno que se espera que se barajan ).

Una alternativa sería la creación de su propia clase de cubierta que tiene un NSMutableArray como una variable de instancia. Allí se pueden definir acciones en su cubierta exactamente como le gustaría, y el hecho de que está utilizando un NSMutableArray se convierte en un detalle de implementación. Esto le permite tomar ventaja de verificación de tipos en tiempo de compilación y se le permite cambiar la implementación interna de la clase cubierta sin cambiar sus clientes. Por ejemplo, si decide por alguna razón que un NSMutableDictionary sería una mejor almacén de respaldo, puede hacer todos esos cambios dentro de la implementación de la clase cubierta sin cambiar nada del código que crea y utiliza la cubierta.

Otros consejos

Por lo general, no se necesita de una subclase, pero en cualquier caso las sugerencias realizadas por Apple son:

Cualquier subclase de NSArray debe anulan los métodos de instancia primitivas count y objectAtIndex:. Estos métodos deben operar en el almacén de respaldo que nos proporciona para los elementos de la colección. Para este almacén de respaldo se puede utilizar una matriz estática, un objeto NSArray estándar, o algún otro tipo de datos o mecanismo. También puede optar por anular, parcial o totalmente, cualquier otro método NSArray para el que desea proporcionar una implementación alternativa.

¿Realmente anulan countmethod? Como se suele decir que tiene que proporcionar su propia estructura de apoyo a elementos de la matriz de retención, y reemplazar los métodos sugeridos Teniendo en cuenta esto ..

Si sólo va a añadir nuevos métodos, y con el almacén de respaldo existente, a continuación, un mejor enfoque consiste en añadir una categoría a NSArray. Las categorías son una parte muy poderosa de Objective-C - ver cocoadev para algunas muestras

.

NSMutableArray ya tiene un - (void)removeObjectsInArray:(NSArray *)otherArray; Usted va a estar mejor fuera de hacer una subclase NSObject con una propiedad de matriz mutable.

En este caso particular, me barajar la matriz mediante -sortedArrayUsingComparator: y hacer que su comparador regresar al azar o NSOrderedAscending NSOrderedDescending.

por ejemplo:

NSArray *originalArray; // wherever you might get this.
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator:
    ^(id obj1, id obj2) { 
     return random() %  2 ? NSOrderedAscending : NSOrderedDescending;
     }];
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top