«Объект 0x84be00 класса NSCFString автоматически освобожден без пула на месте - только утечка» - но в первой строке приложения! - PullRequest
3 голосов
/ 21 марта 2011

В моем приложении для iPhone я получаю три странных предупреждения в консоли в самом начале приложения, еще до того, как будет вызван какой-либо код:

*** __NSAutoreleaseNoPool(): Object 0x84be00 of class NSCFString autoreleased with no pool in place - just leaking
*** __NSAutoreleaseNoPool(): Object 0x84b000 of class NSCFString autoreleased with no pool in place - just leaking
*** __NSAutoreleaseNoPool(): Object 0x849c00 of class NSCFString autoreleased with no pool in place - just leaking

Я использую MBProgressHUD в нескольких местах для отображения индикаторов прогресса, на что указывали некоторые другие обсуждения этой проблемы, потому что он создает новый поток при отображении индикатора прогресса. Но самое странное, что они, похоже, выбрасываются еще до начала моей функции main ():

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

Когда я ставлю точку останова в своем коде на самом первом NSAutoreleasePool, еще до того, как эта строка запускается, я получаю это предупреждение. Что может быть причиной ошибки, когда якобы я до этого момента не запускал свой собственный код?

Ответы [ 5 ]

5 голосов
/ 21 марта 2011

Скорее всего, у вас где-то работает конструктор до main(), который вызывает эту проблему.С какими библиотеками вы ссылаетесь и / или используете ли вы какие-либо директивы __attribute__?

Герп.

Понял что-то очевидное.Поскольку объекты просочились, они все еще существуют.Установите точку останова на main(), а затем в приглашении GDB введите po 0x84be00 (только замените 0x84be00 на адрес одной из пропущенных строк).

Это покажет вамсодержимое этой строки и дает вам очень хорошее представление о том, что является причиной.

Сумасшедший.

Установите точку останова на __NSAutoreleaseNoPool и посмотрите, что показывают обратные следы.

Сегодня я потерпел неудачу в очевидном (только в очевидном, потому что я был на этом пути 18,27314 миллиона раз).

2 голосов
/ 03 февраля 2012

Я искал ответ на эту проблему, но мне удалось выяснить, в чем проблема после некоторого исследования. У меня тоже была эта ошибка, которая произошла до того, как было выполнено main, и я отследил ее, реализовав метод + (void) load, который, как мне показалось, был отличным именем для загрузки некоторых данных, специфичных для глобального класса. Я не понимал, что нагрузка на самом деле уже была определена, и я использовал ее, переопределяя загрузку по умолчанию, и загрузка выполняется перед основной. Таким образом, я протекал. Переименование в myload исправило это.

2 голосов
/ 26 августа 2011

В приложениях, использующих фоновые потоки, вам нужно создать пул автоматического выпуска в фоновом методе :

-(void)myMethodThatRunsOnBackground:(id)param {
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

  //body of method

  [pool release];
}

кредит ответа: nobre84 на iphonedevsdk.com

2 голосов
/ 21 марта 2011

Где-то в приложении есть статическая переменная, которая инициализируется вне основного цикла выполнения.Что-то вроде:

static UIImage *myImage = [UIImage imageNamed:@"fred.png"];

Ищите любые статические переменные, которые инициализируют объекты, и инициализируйте их в чем-то вроде applicationDidFinishLaunching, чтобы настроить их с пулом автоматического выпуска.

Даже если он говоритУтечка NSString, это может быть любой объект.

0 голосов
/ 21 марта 2011

Вы можете попытаться установить символическую точку останова для автоматического выпуска, чтобы увидеть, где и когда это вызывается.

...