Приборы указывают на утечку памяти!

Привет, у меня есть этот код для инициализации моего класса.

- (id)initWithSize:(int)size {

    self = [super init];

    if( self != nil )
    {
        [self setMyVector:[[NSMutableArray alloc] initWithCapacity:size]];

        for ( int i = 0; i < size; i++ ) 
        {
            [myVector addObject: [[NSMutableArray alloc] initWithCapacity:size]];
        }
    }

    return self;
}

У меня эта утечка в инструментах!
Категория: CFArray (store-deque)
Тип события: Malloc

Кто-нибудь знает, что мне нужно для ее устранения? Спасибо!


person Hitcurst    schedule 06.09.2009    source источник
comment
if (self != nil) можно заменить на if (self).   -  person Georg Schölly    schedule 07.09.2009


Ответы (1)


Утечка находится в вашем цикле for, а также, возможно, в предыдущем.

Во-первых, эта строка:

[self setMyVector:[[NSMutableArray alloc] initWithCapacity:size]];

Если setMyVector сохраняет переданный массив (что, согласно соглашению, вероятно, должно), значит, вы утекли в массив. Сначала вы выделяете и инициализируете массив. У него остаточный счет +1. Затем вы устанавливаете его в переменную экземпляра myVector, что означает, что он имеет счетчик удержаний +2. Когда вы помещаете что-то еще в myVector или освобождаете переменную myVector в своем методе dealloc, вы собираетесь уменьшить счетчик сохранения, что означает, что он будет иметь счетчик сохранения +1. Другими словами, он не будет освобожден, и вы утекли в массив.

Другая определенная утечка находится внутри вашего цикла for (), где у вас есть:

[myVector addObject: [[NSMutableArray alloc] initWithCapacity:size]];

Опять же, вы создаете массив с сохраняемым счетчиком +1, затем добавляете его в массив myVector, который снова сохранит его (+2). Однако у вас больше нет указателя на массив, поэтому вы его утекли.

Обе эти утечки можно устранить, используя [NSMutableArray arrayWithCapacity:size] вместо подхода alloc / init. Это создаст автоматически выпущенный массив, который устранит вашу утечку памяти.

Если вы не знаете, что такое автосвобождение, вы можете рассмотреть возможность создания массива и сохранения его в локальной переменной, добавления его в myVector (или установки в myVector), а затем сразу же его освобождения.

person Dave DeLong    schedule 06.09.2009