Проблема в том, что установщик вашего свойства имеет retain
семантику. Вам нужно autorelease
при настройке свойства, например:
self.photoAlbum = [[[NSMutableArray alloc] initWithCapacity:100] autorelease];
или, еще лучше:
self.photoAlbum = [NSMutableArray arrayWithCapacity:100];
Причина этого в том, что создатель, который вы сгенерировали, синтезируя это свойство, выглядит примерно так (упрощенно):
- (void)setPhotoAlbum:(NSMutableArray *)array {
[photoAlbum autorelease];
photoAlbum = [array retain];
}
Итак, что происходит:
[photoAlbum autorelease];
photoAlbum = [[[NSMutableArray alloc] initWithCapacity:100] retain]; // 0 + 2 = 2
// in -dealloc:
[photoAlbum release]; // 2 - 1 = 1
Следовательно, photoAlbum
никогда не освобождается достаточное количество раз для освобождения, поскольку -release
выглядит примерно так (сильно упрощенно):
- (void)release {
retainCount = retainCount - 1;
if (retainCount == 0) {
[self dealloc];
}
}
(Я хочу повторить, что это в основном то, что делает реализация, а не то, как она выглядит в реальной жизни). Дело в том, что вы не будете инициировать освобождение, пока не уравновесите свои релизы с вашими удержаниями.
Не воспринимайте это как призыв к КАЖДОМУ взгляду на -retainCount
, никогда, никогда. Другие объекты, существующие во время выполнения, могут сохранять ваш объект и делать с ним вещи, о которых вы не знаете; следовательно, фактический счетчик вашего объекта в любой момент времени для вас бесполезен. Пожалуйста, никогда, никогда не используйте его при управлении памятью. @bbum поблагодарит вас.