理解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总是空的。有什么问题?
答案 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
}