0

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?

Kjuly
35.3k22 gold badges108 silver badges120 bronze badges
asked Oct 15, 2012 at 9:19
1

4 Answers 4

3

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.

answered Oct 15, 2012 at 9:28

1 Comment

While the solution given is correct, the explanation is wrong. You don't get an exception because nil is considered to be a valid object by the runtime and any message sent to nil returns straight away with a return value of 0 (or equivalently nil). [nil count] therefore returns 0.
3

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]
answered Oct 15, 2012 at 9:22

Comments

2

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
answered Oct 15, 2012 at 9:22

Comments

2

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
}
answered Oct 15, 2012 at 9:39

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.