2012-10-15 42 views
0

对于理解Obj-C对内存及其概念的理解还存在一些困难。NSMutableArray总是空的?

所以我的主类包含一个NSMutableArray包含一些字符和他们的武器清单。它是这样的:

在主class.h

@property (nonatomic, retain) NSMutableArray *players; 

在主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. 
} 

这里weaponsList总是空的。哪里不对?

+0

的可能重复[空NSMutableArray里,不知道为什么(http://stackoverflow.com/questions/11632308/empty-nsmutablearray-not-sure-why) – Vladimir

回答

3

其他答案是正确的。在任何其他语言中,如果引用一个未分配的对象,您将得到一个NullPointerException。但在客观C发送到零的方法只是返回0,它不会崩溃的应用程序。如果你想继续读下去,读this

这就是为什么

[self.weaponsList addObject:weapon]; 

没有崩溃,而在Java中,如果你尝试添加对象到一个未分配的数组程序将会崩溃。至于其他的答案中指出,该声明

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

分配存储器来存储阵列,以及参考返还给变量weaponList。现在武器列表!=零。

+1

虽然给出的解决方案是正确的,但解释是错误的。你不会得到一个异常,因为运行时nil被认为是一个有效的对象,任何发送给nil的消息都会立即返回值0(或者等于零)。因此'[nil count]'返回0。 – JeremyP

2

我还没有看到武器列表对象分配。你初始化它吗?

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

PS:次要忠告。方法“ - (ID)初始化:(球员*)播放器:(武器*)武器”签名会更好看,如果你改变它作为

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

你之前的Alloc您的阵列中添加任何对象正在使用更方便在里面。你可以使用下面的代码viewDidLoad方法

NSMutableArray *players = [[NSMutableArray allo]init]; 
NSMutableArray weaponsList = [[[NSMutableArray alloc] init] 
2

我ASLO建议改一下你的初始化语法和初始化带有对象数组:

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