Подтвердить что ты не робот

Утечка памяти ARC

Я испытываю утечки памяти, связанные с NSMutableArray в проекте, настроенном на использование ARC, который, как я думал, должен был обрабатывать эти вещи для вас.

Следующий код запускает утечки NSNumbers:

NSMutableArray *myArray = [[NSMutableArray alloc] init];

NSNumber  *myNumber = [NSNumber numberWithFloat:10];

[myArray addObject:myNumber];

Запуск последней строки дает в отладчике следующее:

objc [1106]: Объект 0x765ffe0 класса __NSCFNumber автореализован без пула на месте - просто утечка - разрыв на objc_autoreleaseNoPool() для отладки

Кроме того, объект, кажется, правильно добавлен в изменяемый массив,

Я делаю что-то очевидное неправильно?

Примечание. В проекте есть один класс, с которым я не мог работать с ARC, поэтому я исключил его из ARC, используя флаг компилятора -fno-objc-arc. Однако утечки происходят в других классах, которые используют ARC. Не уверен, что это связано.

Большое спасибо за вашу помощь.

4b9b3361

Ответ 1

Вероятно, вы используете этот код в фоновом потоке и не имеете пула автозаполнения. ARC по-прежнему будет авторизовать объекты для вас, и если вы звоните в рамки Apple, они все равно могут быть не ARC, поэтому они определенно могут быть автореализовыванием объектов для вас. Таким образом, вам по-прежнему нужен пул авторефератов.

Cocoa создает пул автозапуска для вас в основном потоке, но ничего не делает для вас в фоновом потоке. Если вы собираетесь что-то удалять в фоновый поток без использования NSOperation или что-то еще, вы захотите обернуть этот поток в @autoreleasepool, например:

- (void)doSomething {
    [self performSelectorInBackground:@selector(backgroundSomething)];
}

- (void)backgroundSomething {
    @autoreleasepool {
        NSLog(@"Here I am in the background, doing something.");
        myArray = [[NSMutableArray alloc] init];
        // etc.
    }
}

Ответ 2

Скорее всего, вы определили NSMutableArray как статическую переменную. Когда вы это делаете, вы выходите за пределы любого пула авторезистов, поскольку статические определения активируются вне любой рабочей среды. ARC не волшебным образом, он просто автоматизирует вызовы управления памятью в рамках существующей структуры keep/release и поэтому не может помочь в этих случаях.

Решение состоит в том, чтобы инициализировать статическую переменную где-то в классе, чтобы ваш изменяемый массив был построен внутри runloop.