Давайте проверим этот фрагмент кода с учетом правил управления памятью какао . Я собираюсь немного его изменить:
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: копию? Нет.
- Вы сохранили объект? Нет.
Следовательно, применяется последнее выделенное жирным шрифтом предложение.
Вы не должны выпускать объект. Релиз в коде неверный.
Я довольно подробно изложил вышеизложенное не для того, чтобы попытаться дать вам пощечину и заставить вас выглядеть глупо, а потому, что раньше я находил эти вещи такими же запутанными, как вы, и единственным способом, которым я мог остановить свой код от Утечка или сбой происходили из-за того, что мы мысленно отметили ответы на эти четыре вопроса практически для каждого объекта, который я использовал. Это не займет много времени, чтобы стать второй натурой, так что вы можете взглянуть на кусок кода и мгновенно выяснить, что нужно выпустить.