Вы уже освободили массив с [aux release];
- у вас фактически есть проблема, противоположная утечке: чрезмерный выпуск.
Назначения в Objective-C - это просто назначения указателей; нет копирования или автоматического управления памятью . Когда вы говорите array = aux;
, array
теперь указывает на тот же объект, что и aux
. Если вы затем избавитесь от aux
, освободив его (и, следовательно, позволив ему освободиться), array
больше ни на что не указывает. *
У вас есть несколько способов исправить это:
(Простейший) Присвойте вновь созданный массив непосредственно array
:
array = [[NSMutableArray alloc] initWithCapacity:1];
Это дает вам право собственности на новый массив под именем array
. Не отпускайте его, пока не закончите (возможно, в dealloc
; конечно, не в этом методе).
(Наилучший) Создайте объявленное свойство для array
и предоставьте этому механизму управление памятью для вас:
@interface MemoryTestViewController : UIViewController
{
NSMutableArray *array;
}
@property (copy, nonatomic, setter=setArrayByMutableCopy) NSMutableArray * array;
@end
@implementation MemoryTestViewController
@synthesize array;
// Properties can't automatically make mutable copies, so you need to create
// your own setter method.
- (void) setArrayByMutableCopy: (NSMutableArray *)newArray {
NSMutableArray * tmp = [newArray mutableCopy];
[array release];
array = tmp;
}
...
* Или, скорее, он указывает на место, где раньше был допустимый объект, что является отличным способом аварийного завершения вашей программы.