Что происходит, когда вы добавляете Class в NSMutableArray и изменяете как этот объект, так и массив? - PullRequest
0 голосов
/ 07 декабря 2010

Предположим, у вас есть несколько объявлений объектов Class и вы добавили их в NSMutableArray, затем изменили как объекты Class, так и объект NSMutableArray. Что просходит?

Пример кода:

MyClass *item1;
MyClass *item2;
NSMutableArray *itemHolder;

item1 = [[MyClass alloc] init];
item2 = [[MyClass alloc] init];
itemHolder = [[NSMutableArray alloc] initWithObjects:item1,item2,nil];

-(void)someFunction{
  [item1 setVarName:@"item1"];
  [item2 setVarName:@"item2"];
  for(MyClass *items in itemHolder) [items setVarName:@"item"];
}

Я думаю, что обычно выпускаю item1 и item2 после добавления их в itemHolder, но это не нарушает правила управления памятью, верно? Потому что в конце в dealloc вы все равно можете отпустить все

-(void)dealloc{
  [item1 release];
  [item2 release];
  [itemHolder release];
}

Ответы [ 2 ]

1 голос
/ 07 декабря 2010

Когда вы добавляете объекты (item1 и item2) в массив, массив просто хранит указатель. Сам объект не копируется.

Таким образом, когда вы устанавливаете VarName для item1 или setVarName для первого элемента в NSArray, оба действия влияют на один и тот же объект (тот же экземпляр)

Что касается памяти mgmt, когда вы добавляете элементы в NSArray, NSArray (изменяемый или нет) сохранит каждый из них. Когда массив освобождается, он освобождает каждый из них.

Если у вас есть какая-то другая необходимость сохранить каждый элемент в отдельности, то вам следует это сделать (как в вашем примере). Но имейте в виду, что в обычных программах вы чаще всего просто добавляете новые объекты в массив и освобождаете их немедленно, так как массив сохранил их.

Но, опять же, трудно обобщить, не глядя на конкретный пример.

0 голосов
/ 07 декабря 2010

Если вы попытаетесь выпустить что-то, что уже было выпущено, вы, вероятно, получите EXC_BAD_ACCESS или ошибку сегментации.Постарайтесь убедиться, что вы не выпускаете один и тот же объект дважды.

Если вы освободите объект, содержащийся в массиве, а затем освободите item1 или item2, вы будете освобождать один и тот же объект дважды из двух разных ссылок

Если вы измените объект класса, то будет затронута и версия в массиве, и наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...