NSMutableArray always empty?

2019-09-13 08:07发布

Still have some difficulties to understand Obj-C's gestion of memory and some of its concepts.

So my main class contains a NSMutableArray containing some characters and their list of weapons. It's like this :

In Main class.h

@property (nonatomic, retain) NSMutableArray *players;

In Main class.m's 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.
}

Here weaponsList is always empty. What is wrong?

4条回答
Melony?
2楼-- · 2019-09-13 08:43

You have to alloc your array before add any object in it. you can use following code in viewDidLoad method

 NSMutableArray *players = [[NSMutableArray allo]init]; 
 NSMutableArray weaponsList = [[[NSMutableArray alloc] init]
查看更多
Lonely孤独者°
3楼-- · 2019-09-13 08:47

I've not seen weaponList object allocation. Do you initialize it?

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

PS: Minor advice. Method "- (id) init : (Player*) player : (Weapon*) weapon" signature will look better and being used easier if you change it as

- (id) initWithPlayer:(Player *)player weapon:(Weapon *)weapon
查看更多
看我几分像从前
4楼-- · 2019-09-13 08:53

The other answers are right. On any other language if you reference a unallocated object you will get a NullPointerException. But in objective C the method sent to nil just returns 0 and it won't crash the app.. If you want further read, read this

That is why

[self.weaponsList addObject:weapon];

didn't crash, while in java if you try to add object to a unallocated array your program will crash.. As other answers pointed out, the statement

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

alloc memory to store array, and a reference is given back to to variable weaponList. Now weaponList != nil.

查看更多
放荡不羁爱自由
5楼-- · 2019-09-13 09:04

I aslo suggest to change a bit your init syntax and init the array with object:

- (id) initWithPlayer:(Player *)aPlayer weapon:(Weapon *)aWeapon {
    self.weaponsList = [NSMutableArray arrayWithObject:aWeapon];
    [self.weaponsList retain];
    // remember to release inside dealloc, or use autorelease
}
查看更多
登录 后发表回答