Pregunta

Estoy tratando de construir una matriz anidada: En primer lugar, hago una matriz "PlayerItems" que contendrá 10 matrices, cada uno conteniendo objetos de elemento, correspondiente a los inventarios de cada jugador en el juego. En la línea indicada, me sale el siguiente error:

  

Error: void no se valora ignorada como debería ser

¿Cuál es el valor nulo aquí? Si usara [[PlayerItems objectAtIndex:i] addObject:myitem] lugar, el programa compila pero se bloquea. Si comento esa línea, se compila y se ejecuta en Aceptar. Gracias por su ayuda!

self.PlayerItems = [[NSMutableArray alloc] initWithCapacity:11];
NSMutableArray *itemarray = [[NSMutableArray alloc] initWithCapacity:60];
item *myitem = [[item alloc] init];
item.kind = 1;
for (int i = 1; i < 10; i++) {
    itemarray = [[NSMutableArray alloc] initWithCapacity:60];
    [PlayerItems addObject:itemarray];
    for (int i2 = 1; i2 < 50; i2++) {
        myitem = [[item alloc] init];
        myitem.kind = 1;
        // The error occurs on the line below:
        ((NSMutableArray *) [[PlayerItems objectAtIndex:i] addObject:myitem]);
    }
}
¿Fue útil?

Solución

lo haría de la siguiente manera:

self.playerItems = [[NSMutableArray alloc] initWithCapacity:11];

NSMutableArray * itemArray;
Item * anItem;
for (int playerIndex = 1; playerIndex <= 10; playerIndex++)
{
    itemArray = [NSMutableArray arrayWithCapacity:60];
    [playerItems addObject:itemArray];

    for (int itemIndex = 1; itemIndex <= 50; itemIndex++)
    {
        anItem = [[Item alloc] init];
        anItem.kind = 1;
        [itemArray addObject:anItem];
        [anItem release];
    }
}

Como nota al margen, que sin duda debe leer sobre gestión de memoria en cacao , ya que su código original está lleno de pérdidas de memoria. Puede ser un poco difícil de envolver su cabeza en torno al principio, pero una vez que se aprende, se convierte en una segunda naturaleza. Bien vale la pena el esfuerzo.

actualización:

Una forma más orientado a objetos para hacer esto sería la creación de una clase Player, y que cada Player gestionar su propio conjunto de elementos:

Player.h

@interface Player : NSObject
{
    NSMutableArray * items;
}
@property (readonly) NSMutableArray * items;
@end

Player.m

#import "Player.h"
@implementation Player

@synthesize items;

- (id)init
{
    if ((self = [super init]) == nil) { return nil; }

    items = [[NSMutableArray alloc] initWithCapacity:60];
    Item * anItem;
    for (int itemIndex = 1; itemIndex <= 50; itemIndex++)
    {
        anItem = [[Item alloc] init];
        anItem.kind = 1;
        [items addObject:anItem];
        [anItem release];
    }

    return self;
}

- (void)dealloc
{
    [items release];
    [super dealloc];
}

@end

En otras partes

NSMutableArray * allPlayers = [[NSMutableArray alloc] initWithCapacity:11];

Player * aPlayer;
for (int playerIndex = 1; playerIndex <= 10; playerIndex++)
{
    aPlayer = [[Player alloc] init];
    [allPlayers addObject:aPlayer];
    [aPlayer release];
}

...

[allPlayers release];

Otros consejos

  

Hola, estoy tratando de construir una matriz anidada ...

No hacer eso. formaciones paralelas y jerarquizadas son más difíciles de escribir y de leer que las soluciones orientadas a objetos reales como el que eJames sugirieron, que es el de la creación de una clase del modelo.

Considere el código para establecer el tipo de elemento primer elemento de cada jugador. Con matrices paralelas / anidada:

for (NSArray *items in PlayerItems)
    [[items objectAtIndex:0U] setKind:newKind];

Con los objetos del modelo:

for (Player *player in players)
    [player setKind:newKind];

¿Cuál es más claro?

El trabajo necesario para mantener formaciones paralelas y jerarquizadas, para mantener a todos sincronizados para cada cambio y acceder a cualquier elemento de ellos, es mucho mayor que el trabajo que se requiere para crear una clase del modelo. Además, si se decide a puerto para el Mac, no tener una clase de modelo que duele activamente, ya que no puede utilizar enlaces e implementar soporte AppleScript (no es un gran problema para un juego, lo admito) es casi imposible.

Como eJames también mencionaron, se filtra la objetos profusamente. Seguir su recomendación y leer la Guía de Programación de la administración de memoria de cacao.

Como dijo PGB, los índices de matriz en Cocoa (y C, para el caso) comienzan en 0. Además, por lo general no usan índices menos que sea necesario; ver mis anteriores ejemplos de código de una manera mucho más clara para iterar sobre una matriz.

Como PGB y Christian señalan tanto, addObject: es el método que devuelve void, que luego lanzas a NSMutableArray *. ¿La intención era poner ese molde dentro del primer par de corchetes cuadrados? Pero esto es otro problema que no tendría si tuviera una clase modelo real, como lo haría a configurar todo lo relacionado con el nuevo jugador a la vez, incluyendo sus elementos:

Player *player = [[Player alloc] init];

//Set up name, SPECIAL stats, etc.

for (int kind = 1; kind < 50; ++kind) {
    Item *item = [[Item alloc] init]; //I capitalized your class name for you.
    [item setKind:kind];
    [player addInventoryObject:item]; //Assume “inventory” is the name of the property that holds the player's items.
    [item release];
}

[allPlayers addObject:player];
[player release];

Esto me lleva a una sugerencia más: Usted también puede hacer una clase de modelo para los tipos de elementos, y tienen una gran variedad de aquellos en alguna parte. Entonces, cada clase puede tener un nombre, un icono, tal vez una descripción, la naturaleza, como una sola mano frente a dos manos, los requisitos de clase, los requisitos de estadísticas, etc., todo allí mismo, en el objeto-artículo bueno. El bucle tendrá el aspecto siguiente:

for (ItemKind *kind in [self kindsOfItems]) {
    Item *item = [[Item alloc] initWithKind:kind];
    [player addInventoryObject:item];
    [item release];
}

Además, si el diseño de esta propiedad kindsOfItems extensibly, puede permitir a los jugadores añadir más tipos de artículos más tarde, ya sea a través de plug-ins (Mac) o en la aplicación de compras (iPhone).

Las matrices en Objective-C son cero basado, y su bucle está empezando en 1. Se debe cambiar a

for (int i = 0; i < 10; i++)

En cuanto al error de vacío, no es necesario convertir el valor de retorno de addObject: ya que regresa vacía, es por eso que está recibiendo la advertencia.

Esa línea debe decir:

[[PlayerItems objectAtIndex:i] addObject:myitem];

En la última línea que está llamando addObject: que devuelve void:

- (void)addObject:(id)anObject

A continuación, intenta convertir a vacío NSMutableArray *. Y también no asigna el vacío fundido a nada.

Para añadir el subconjunto de la matriz de esto debería ser suficiente:

[[PlayerItems objectAtIndex:i] addObject:myitem];

Por cierto: Estás creando sólo 9 matrices y va a añadir sólo 49 subarreglos

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top