Помогите мне понять, почему мне не нужно выделять этот NSMutableArray - PullRequest
0 голосов
/ 07 июля 2011

В firstViewController,

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

SecondViewController.m

Class1 *class1;
NSMutableArray *object2;

В ViewDidLoad, Я думаю, что object2 указывает на тот же объект, что и class1, и поэтому его не нужно выделять.

[self setObject2:[class1 someNSMutableArray]];

В init мне не нужно выделять object2, и все приложение все еще работает. Это потому, что object2 указывает на тот же элемент в памяти, что и [class1 someNSMutableArray].

Если это так, то что произойдет, если я выделю object2. Будет ли 2 копии? Приложение все равно работает, если я его инициализирую.

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

Запутанная часть заключается в том, что если я инициализирую с помощью автоматического выпуска, это даст мне ошибку dealloc, освобождение от освобождения ошибки объекта

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

Спасибо, мучо !!!

1 Ответ

1 голос
/ 07 июля 2011

Ваша идея по первой части вопроса верна.

[self setObject2:[class1 someNSMutableArray]];

object2 - это переменная, которая теперь содержит тот же адрес, что и [class1 someNSMutableArray].Так что оба указывают на один и тот же объект NSMutableArray.

Это отличается от:

object2 = [[NSMutableArray alloc] init];

В этом случае вы создали новый объект NSMutableArray и поместили этот адрес в переменной экземпляра object2.Так что теперь он указывает на массив, отличный от [class1 someNSMutableArray].

Ключевое слово "создан".Думайте о alloc / init как о создании нового объекта.

Что касается управления памятью:

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

Я предполагаю, что вы (правильно) освобождаете object2 в -dealloc для этого класса.Таким образом, у вас есть два релиза (этот релиз в dealloc плюс этот авто-релиз здесь) против только одного retain (от alloc / init), и, следовательно, вы переизбираете объект.

...