Вы уже выпустили массив с [aux release];
- у вас на самом деле есть противоположная проблема с утечкой: перевыпуск.
Назначения в Objective-C - это просто назначения указателей; нет копирования или автоматического копирования memory management. Когда вы говорите array = aux;
, array
теперь указывает на тот же объект, что и aux
. Если затем избавиться от aux
, освободив его (и, следовательно, позволяя ему быть высвобождены), array
не указывает ни на что больше *
У вас есть несколько вариантов для фиксации этого:.
(Простейшие) Присвоить вновь созданный массив непосредственно array
:
array = [[NSMutableArray alloc] initWithCapacity:1];
Это дает вам право собственности на новый массив под названием array
. Не отпускайте его, пока вы не закончите с ним (возможно, в dealloc
, конечно, не в этом методе).
(Best) Создание declared property для 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;
}
...
* Или, скорее, он указывает на место, где раньше было действительный объект, который является отличным способом сделать вашу программу аварийной.
Что произойдет, если у меня есть что-то вроде NSString * name = [[NSString alloc] ...], а затем снова сделаю name = [[NSString alloc ] ...] Должен ли я освободить его перед повторным назначением? –
Да. В противном случае вы выделили бы память для первой строки, но заменили бы вашу ссылку на блок выделенной памяти, поэтому вы не сможете ее позднее выпустить. Вы должны использовать Google для «управления памятью ios» и читать руководства Apple. Все будет проще с iOS5, у которого есть автоматический подсчет ссылок. – Krumelur
Могу ли я сделать что-то вроде [name initWithString: ...] после первого выделения? –