简体   繁体   中英

Help me understand why I don't have to allocate this NSMutableArray

In firstViewController,

SecondViewController *secondViewController = [[[SecondViewController alloc] init] autorelease];
// Pass data to secondViewController
[secondViewController setClass1:anObjectFromFirstViewController];
[[self navigationController] pushViewController:secondViewController ...];

SecondViewController.m

Class1 *class1;
NSMutableArray *object2;

In viewDidLoad, I think object2 points to the same object as class1 and therefore does not need to be allocated.

[self setObject2:[class1 someNSMutableArray]];

In init, I don't have to allocate object2 and the whole app still works. Is it because the object2 is pointing to the same item in memory as [class1 someNSMutableArray] .

If that is the case, then what happens if I do allocate object2. Will there be 2 copies? The app still works the same if I initialize it.

-(id)init { object2 = [[NSMutableArray alloc] init]; }

The confusing part is that if I initialize with autorelease, it will give me a dealloc error, the deallocating to a released object error

-(id)init { object2 = [[[NSMutableArray alloc] init] autorelease]; }

Thanks mucho!!!

Your idea on the first part of the question is correct.

[self setObject2:[class1 someNSMutableArray]];

object2 is a variable which now contains the same address as [class1 someNSMutableArray]. So both point to the same NSMutableArray object.

This is different from:

object2 = [[NSMutableArray alloc] init];

In this case you have created a new NSMutableArray object and put that address in the object2 instance variable. So that is now pointing to a different array than [class1 someNSMutableArray].

The key word there is "created". Think of alloc/init as creating a new object.

As for memory management:

object2 = [[[NSMutableArray alloc] init] autorelease];

I'm assuming you are (correctly) releasing object2 in the -dealloc for this class. So you have two releases (that release in dealloc plus this autorelease here) against only one retain (from the alloc/init), and therefore you are over-releasing the object.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM