在Objective-C嵌套阵列(NSMutableArray的)(Nested arrays in

2019-07-31 15:26发布

我试图建立一个嵌套的数组:第一,我做一个“PlayerItems”数组将包含10个阵列,每个包含的项目对象,对应于在游戏中每个玩家的库存。 在指定的行,我得到以下错误:

错误:无效看重的不是忽略,因为它应该是

什么是这里的空值? 如果我用[[PlayerItems objectAtIndex:i] addObject:myitem]相反,程序编译,但是崩溃。 如果我评论说,线路输出,它编译和运行正常。 谢谢您的帮助!

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]);
    }
}

Answer 1:

我想如下做到这一点:

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];
    }
}

作为一个侧面说明,你一定要在阅读了可可的内存管理 ,因为你原来的代码是完全的内存泄漏。 它可以是一个有点难以在第一环绕你的头,但一旦你了解它,它就会成为第二本能。 非常值得的努力。

更新:

一个更面向对象的方式来做到这将是创建一个Player类,并让每个Player管理自己的项目集:

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

别处

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];


Answer 2:

嗨,我试图建立一个嵌套数组...

不要那样做。 平行和嵌套数组更难写入和不是像一个eJames建议,这是建立一个模型类的真实的面向对象解决方案来读取。

考虑代码设置的项目类型的每一个球员的第一个项目。 与并行/嵌套的数组:

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

随着模型对象:

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

哪一个更清晰?

保持平行和嵌套数组需要,让他们所有的每一个变化同步的,在他们访问的任何项目的工作,远比创建一个模型类所需的工作量更大。 此外,如果您决定移植到Mac上,没有一个模型类积极地伤害了你,因为你不能使用绑定和落实AppleScript的支持(没有这样一个大问题,一个游戏,我承认)几乎是不可能的。

作为eJames也提到,你是大汗泄漏对象。 按照他的建议,并请阅读可可的内存管理编程指南。

作为PGB说,可可数组索引(和C,对于这个问题),从0开始。此外,你一般除非你有不使用索引; 看到上面更清晰的方式在磁盘阵列上重复我的代码示例。

作为PGB和基督教都指出, addObject:是返回的方法void ,你再投给NSMutableArray * 。 也许你的意思是把那个投第一对方括号内? 但是,这是另外一个问题,如果你有一个真正的模型类,你会立刻建立对新球员的一切,包括他的项目,你不会有:

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];

这使我多了一个建议:您可能还需要做出一个模型类的物品种类,并让这些地方的数组。 然后,每种可以有一个名称,图标,也许是一个名称,性质,如单手对两手,等级要求,统计要求等,所有正确的,在该项目的实物对象。 然后,循环如下所示:

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

此外,如果你设计这个kindsOfItems可延伸属性,可以让玩家后,无论是通过插件(Mac)或应用程序内购买(iPhone)增加更多的项目种类。



Answer 3:

在Objective-C的阵列从零开始,你的for循环开始在1.您应将其更改为

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

至于虚空错误,你不需要投的返回值addObject:因为它返回void,这就是为什么你所得到的警告。

该行应为:

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


Answer 4:

在最后一行你打电话ADDOBJECT:返回无效:

- (void)addObject:(id)anObject

然后,您尝试投空隙的NSMutableArray *。 而且你还没有铸造无效分配到任何东西。

要子阵列添加到您的数组这应该是足够了:

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

顺便说一句:你创建只有9数组和您要添加的只有49子阵列。



文章来源: Nested arrays in Objective-C ( NSMutableArray )