Вопрос по NSMutableArray, указателям и релизу - PullRequest
0 голосов
/ 01 сентября 2011

Как именно работает метод addObject NSMutableArray?Создает ли он новый экземпляр и добавляет ли он его в массив или просто добавляет ссылку на тот же объект в массив?

Если ответом является то, что он вставляет только ссылку на объект, то это приводит кмой следующий вопрос:

Допустим, у меня есть следующий метод в одном из моих классов («список» является NSMutableArray), с радостью, этот код работает так, как я хотел, но я просто не в полной мерепонять почему:

-(void)buyItem:(Item *)anItem
{
    Item * newItem = [[Item alloc]init];
    newItem.name = anItem.name;
    newItem.details = anItem.details;
    [list addObject:newItem];
    [newItem release];
}

Таким образом, после вызова [list addObject: newItem] теперь будет всего две ссылки, указывающие на один и тот же объект справа (newItem и еще одна в массиве 'list')?

Но почему, выпуская здесь объект newItem, он не уничтожает объект NSMutableArray в списке?Разве они не указывают на один и тот же объект?

Ответы [ 3 ]

2 голосов
/ 01 сентября 2011

Когда вы добавляете объект к NSMutableArray, используя метод addObject:, он retain s добавляется object. Вот почему вы можете release позже, а потом использовать, используя метод objectAtIndex:.

1 голос
/ 01 сентября 2011

Добавляет ссылку, а затем увеличивает количество сохраняемых объектов на единицу.То, что вы делаете, правильно, и оно все еще будет существовать в массиве с сохранением счетчика в единицу.

Для справки. Что увеличивает количество сохраняемых объектов?

0 голосов
/ 01 сентября 2011

Важно понимать разницу между release и dealloc.release просто уменьшает «сохранить счет», за исключением того, что когда счет уменьшается до нуля, release переходит к dealloc объекту.

В общем случае (за исключением случаев, когда задокументировано иное), когда вы передаете ссылку на объект (т. Е. Указатель) на объект Objective-C, и он сохраняет копию этой ссылки сверх продолжительности вашего обращения к нейон retain является объектом от своего имени и берет на себя ответственность за release объект, когда он сам освобождается или когда копия ссылки аннулируется или перезаписывается.

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