我试图建立一个嵌套的数组:第一,我做一个“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]);
}
}
我想如下做到这一点:
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];
嗨,我试图建立一个嵌套数组...
不要那样做。 平行和嵌套数组更难写入和不是像一个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)增加更多的项目种类。
在Objective-C的阵列从零开始,你的for循环开始在1.您应将其更改为
for (int i = 0; i < 10; i++)
至于虚空错误,你不需要投的返回值addObject:
因为它返回void,这就是为什么你所得到的警告。
该行应为:
[[PlayerItems objectAtIndex:i] addObject:myitem];
在最后一行你打电话ADDOBJECT:返回无效:
- (void)addObject:(id)anObject
然后,您尝试投空隙的NSMutableArray *。 而且你还没有铸造无效分配到任何东西。
要子阵列添加到您的数组这应该是足够了:
[[PlayerItems objectAtIndex:i] addObject:myitem];
顺便说一句:你创建只有9数组和您要添加的只有49子阵列。