задача-управление памятью - PullRequest
2 голосов
/ 26 июля 2010

Допустим, у меня есть объект, в котором есть другие объекты.Например, «список» объекта NSMutableArray, который имеет несколько других объектов.

Если я больше не использую какой-либо из них, могу ли я просто набрать [list release]?

Или мне нужноосвободить объекты в списке 1 на 1?

for (int i=0; i < [list count]; i++)
    [[list objectAtIndex(i)] release];

Если бы мне пришлось делать это один за другим, разве это не было бы проблематично, если бы у меня был объект, в котором было много других объектов?Допустим, объект Picture содержит все виды объектов Shape.Есть ли лучший способ?

Ответы [ 3 ]

3 голосов
/ 26 июля 2010

Давайте проверим этот фрагмент кода с учетом правил управления памятью какао . Я собираюсь немного его изменить:

for (int i=0; i < [list count]; i++)
{
    id anObject = [list objectAtIndex(i)] ;
    [anObject release];
}

Это просто, чтобы я мог говорить о anObject, иначе он идентичен вашему коду.

Теперь вы получили объект anObject, отправив objectAtIndex: в массив. Вот соответствующая цитата из правил:

Вы вступаете во владение объектом, если создаете его с помощью метода, имя которого начинается с «alloc» или «new» или содержит «copy» (например, alloc, newObject или mutableCopy), или если вы отправляете ему сохранить сообщение. Вы несете ответственность за отказ от владения принадлежащими вам объектами с помощью выпуска или автоматического выпуска. В любое другое время, когда вы получаете объект, вы не должны отпускать его.

  • ObjectAtIndex: начинается с alloc? Нет.
  • ObjectAtIndex: начинается с нового? Нет.
  • Содержит ли objectAtIndex: копию? Нет.
  • Вы сохранили объект? Нет.

Следовательно, применяется последнее выделенное жирным шрифтом предложение.

Вы не должны выпускать объект. Релиз в коде неверный.

Я довольно подробно изложил вышеизложенное не для того, чтобы попытаться дать вам пощечину и заставить вас выглядеть глупо, а потому, что раньше я находил эти вещи такими же запутанными, как вы, и единственным способом, которым я мог остановить свой код от Утечка или сбой происходили из-за того, что мы мысленно отметили ответы на эти четыре вопроса практически для каждого объекта, который я использовал. Это не займет много времени, чтобы стать второй натурой, так что вы можете взглянуть на кусок кода и мгновенно выяснить, что нужно выпустить.

3 голосов
/ 26 июля 2010

До тех пор, пока у вас нет других ссылок на объекты в списке, достаточно только одного NSMutableArray.

0 голосов
/ 26 июля 2010

Если вы делаете что-то вроде следующего, вам не нужно освобождать каждый объект, потому что вы не используете alloc , copy , new или сохранить на добавленном объекте.

NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObject:[NSNumber numberWithInt:15]];

Если, однако, вы выделяете свой объект до добавления его в массив, вы захотите освободить его.

NSMutableArray *array = [[NSMutableArray alloc] init];
id anObject = [[MyObject alloc] init]
[array addObject:anObject];
[anObject release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...