Rob
Rob

Reputation: 16002

NSMutableArray always empty?

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?

Upvotes: 0

Views: 1335

Answers (4)

Krishnabhadra
Krishnabhadra

Reputation: 34296

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.

Upvotes: 3

Shebuka
Shebuka

Reputation: 3248

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
}

Upvotes: 2

Rahul Patel
Rahul Patel

Reputation: 5896

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]

Upvotes: 3

Orange
Orange

Reputation: 547

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

Upvotes: 2

Related Questions