Nlks
Nlks

Reputation: 45

Passing data in an array from one class to another

hoping for advice on something.

I have a Levels Engine class that creates an NSMutable Array called levelsArray.

I am passing the data to a Levels View Controller which is working just fine.

I also have a Particle Emitter class to which I am hoping to pass the level data.

However I am constantly being told that the count level of the array is 0 when I pass it to the Particle Emitter class.

The array has been setup properly:

    **LevelsEngine.h**  
    @interface
    LevelsEngine : NSObject {   
    NSMutableArray *levelsArray;         }

    @property (retain) NSMutableArray
    *levelsArray;  




    **LevelsEngine.m**  
    @synthesize levelsArray;  
    LevelsArray =[NSMutableArray array];


    **Code used in ParticleEmitter.m**   
    newlevelsArray = [NSMutableArray array];  
    newlevelsArray=view.levelsArray;

Am I right in thinking I am having this error because I am trying to pass the array data from one NSObject to another and not to a view controller?If so how can I pass the data?

Upvotes: 2

Views: 3428

Answers (2)

Himadri Choudhury
Himadri Choudhury

Reputation: 10353

Couple of things.

    **Code used in ParticleEmitter.m**   
    newlevelsArray = [NSMutableArray array];  
    newlevelsArray=view.levelsArray;

The first line is creating a new array. The 2nd line is assigning newlevelsArray to be a pointer to the array in view.levelsArray, leaving the object you created in line #1 orphaned.

I think you were intending the 2nd line to be a field by field copy of the array, but assignments of objects don't work that way.

You can fix this by 2 things.

1) Remove the first line newlevelsArray = [NSMutableArray array];

2) Change the 2nd line to `newlevelsArray = [view.levelsArray copy];

This will actually do a copy, which is probably what you want since you can then go ahead and modify newlevelsArray in ParticleEmitter.m without changing the value in view.

Important note: don't forget to create a -dealloc: method in your Particle emitter class which releases newlevelsArray:

-(void)dealloc {
   if (newlevelsArray) [newlevelsArray release];
   [super dealloc];
}

An alternative solution is to use setters.

Instead of:

2) Change the 2nd line to newlevelsArray = [view.levelsArray copy];

Do:

2) Change the 2nd line to this.newlevelsArray = view.levelsArray; Where you have to define newlevelsArray to be a property of the ParticleEmitter class using

@property (copy) NSMutableArray * newlevelsArray;

Note the use of "copy" instead of "retain". This will do a field by field copy of the array, which is most likely advisable for containers of mutable objects.

Upvotes: 1

V.V
V.V

Reputation: 3094

You need to change your code,

call the newlevelarray in the LevelsEngine.h calls.

and your code should look like

Classobject.newlevelsArray =[nsarray arraywitharray: LevlesArray] ;

This should solve your problem.

Upvotes: 0

Related Questions