NSMutableArray总是空的?

时间:2012-10-15 09:19:14

标签: objective-c nsmutablearray nsarray

理解Obj-C的内存记录及其一些概念仍然有一些困难。

所以我的主类包含一个NSMutableArray,其中包含一些字符及其武器列表。就像这样:

在Main class.h中

@property (nonatomic, retain) NSMutableArray *players;

在Main class.m的init

for(int i = 0 ; i < 30 ; i++)
{
    [players addObject:[[PlayerInGame alloc] init:[self.tabPlayers objectAtIndex:i] :[self.tabWeapons:objectAtIndex:i]]];
}

PlayerInGame.h

@property (nonatomic, retain) NSMutableArray *weaponsList;

PlayerInGame.m

- (id) init : (Player*) player : (Weapon*) weapon
{
    [self.weaponsList addObject:weapon];
    // Then I try NSLog of weaponsList's count.
}

这里的weaponList总是空的。有什么问题?

4 个答案:

答案 0 :(得分:3)

在添加任何对象之前,必须先分配数组。您可以在viewDidLoad方法

中使用以下代码
 NSMutableArray *players = [[NSMutableArray allo]init]; 
 NSMutableArray weaponsList = [[[NSMutableArray alloc] init]

答案 1 :(得分:3)

其他答案是正确的。在任何其他语言中,如果引用未分配的对象,则会出现NullPointerException。但是在目标C中,发送到nil的方法只返回0并且它不会使应用程序崩溃..如果你想进一步阅读,请阅读this

这就是为什么

[self.weaponsList addObject:weapon];

没有崩溃,而在java中,如果你试图将对象添加到一个未分配的数组,你的程序将崩溃..正如其他答案指出的那样,语句

self.weaponsList = [[[NSMutableArray alloc] init] autorelease];

将内存分配给存储数组,并将引用返回给变量weaponList。现在武器清单!=无。

答案 2 :(得分:2)

我没见过weaponList对象分配。你初始化了吗?

self.weaponsList = [[[NSMutableArray alloc] init] autorelease];

PS:小建议。方法“ - (id)init:(玩家*)玩家:(武器*)武器”签名看起来会更好,如果你改变它就会更容易使用

- (id) initWithPlayer:(Player *)player weapon:(Weapon *)weapon

答案 3 :(得分:2)

我还建议更改一下init语法并使用object:

初始化数组
- (id) initWithPlayer:(Player *)aPlayer weapon:(Weapon *)aWeapon {
    self.weaponsList = [NSMutableArray arrayWithObject:aWeapon];
    [self.weaponsList retain];
    // remember to release inside dealloc, or use autorelease
}