Хорошо, много вещей здесь:
1) self.itemList = Так как у вас есть это, я предполагаю, что вы используете свойства. если ваш @property установлен как retain, вызов self.itemList = xxx сильно отличается от itemList = xxx. Видите ли, когда вы используете назначение self.itemList, все, что у вас уже было в itemList, автоматически освобождается для вас, а новое сохраняется. Итак, с этой строкой:
self.itemList = [[NSMutableArray alloc] init];
вы фактически удерживаете дважды, в то время как с этой строкой:
itemList = [[NSMutableArray alloc] init];
вы удерживаете только один раз. Использование свойств - это действительно простой и удобный способ управления записью, но все, что вам нужно в этом случае:
self.itemList = [NSMutableArray array]; //returns an autoreleased array that is then retained by the self.
Тогда вам нужно всего лишь один вызов release в вашем методе dealloc для очистки
[itemList release];
2) Когда элемент добавляется в массив, он сохраняется в массиве, поэтому вы можете освободить его сразу после слова
Foo *f = [[Foo alloc] init];
[itemList addObject:f];
[f release];
Когда массив освобождается, он отправляет сообщение о выпуске всем своим компонентам, поэтому вам не нужно беспокоиться о них с этого момента.
3) Я не уверен в вашем сбое, но попробуйте использовать отладчик, чтобы пройти и найти, где он падает. Похоже, это не связано с управлением памятью, которое у вас есть. Вы можете искать на этом сайте множество вопросов об отладке и поиске источника ошибок памяти, включая мой любимый NSZombieEnabled