0

理解 Obj-C 的记忆体及其一些概念仍有一些困难。

所以我的主类包含一个NSMutableArray包含一些角色和他们的武器列表。就像这样 :

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

此处武器列表始终为空。怎么了?

4

4 回答 4

3

您必须先分配您的数组,然后才能在其中添加任何对象。viewDidLoad您可以在方法中使用以下代码

 NSMutableArray *players = [[NSMutableArray allo]init]; 
 NSMutableArray weaponsList = [[[NSMutableArray alloc] init]
于 2012-10-15T09:22:43.137 回答
3

其他答案都是对的。在任何其他语言上,如果您引用未分配的对象,您将获得 NullPointerException。但是在目标 C 中,发送到 nil 的方法只返回 0,它不会使应用程序崩溃。如果您想进一步阅读,请阅读此内容

因此

[self.weaponsList addObject:weapon];

没有崩溃,而在 java 中,如果您尝试将对象添加到未分配的数组中,您的程序将崩溃。正如其他答案指出的那样,声明

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

分配内存来存储数组,并返回对变量武器列表的引用。现在武器列表!= nil。

于 2012-10-15T09:28:49.700 回答
2

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

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

PS:小建议。方法“- (id) init : (Player*) player : (Weapon*) Weapon” 签名看起来会更好,如果您将其更改为更容易使用

- (id) initWithPlayer:(Player *)player weapon:(Weapon *)weapon
于 2012-10-15T09:22:40.537 回答
2

我还建议更改您的初始化语法并使用对象初始化数组:

- (id) initWithPlayer:(Player *)aPlayer weapon:(Weapon *)aWeapon {
    self.weaponsList = [NSMutableArray arrayWithObject:aWeapon];
    [self.weaponsList retain];
    // remember to release inside dealloc, or use autorelease
}
于 2012-10-15T09:39:27.597 回答