Ошибка времени выполнения: __NSAutoreleaseNoPool (): ... автоматически освобожден без пула на месте - только утечка - PullRequest
0 голосов
/ 25 августа 2011

Я получаю список ошибок, например, следующая ошибка при компиляции проекта для iOS.

2011-08-25 12:32:44.016 rtsp[55457:6003]
    *** __NSAutoreleaseNoPool(): Object 0x64095a0 of class __NSArrayM
    autoreleased with no pool in place - just leaking 

Появляется из-за следующей функции

- (void) start {   
    //Existing code
    session = [[RTSPClientSession alloc] initWithURL:
        [NSURL URLWithString:
         @"rtsp://video3.americafree.tv/AFTVComedyH2641000.sdp"]];
    [session setup];
    NSLog(@"getSDP: --> %@",[ session getSDP ]);
    NSArray *array =  [session getSubsessions];

    for (int i=0; i < [array count]; i++) {
        RTSPSubsession *subsession = [array objectAtIndex:i];       
        [session setupSubsession:subsession clientPortNum:0 ];
        subsession.delegate=self;
        [subsession increaseReceiveBufferTo:2000000];
        NSLog(@"%@", [subsession getProtocolName]);
        NSLog(@"%@", [subsession getCodecName]);
        NSLog(@"%@", [subsession getMediumName]);
        NSLog(@"%d", [subsession getSDP_VideoHeight]);
        NSLog(@"%d", [subsession getServerPortNum]);
    }
    [session play];
    NSLog(@"error: --> %@",[session getLastErrorString]);
    [session runEventLoop:rawsdp];
}

Когда я добавляю и NSAutoreleasePool к моей функции

- (void) start {
    NSAutoReleasePool *pool=[[NSAutoReleasePool alloc] init];
    session = [[RTSPClientSession alloc] initWithURL:[NSURL ...
    ...
    [pool drain];
}

Ошибка ушла, но я не получаю вывод от своей функции. Является ли добавление NSAutoreleasePool правильным решением?

1 Ответ

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

Вы получаете сообщение на консоли, потому что вы запускаете метод запуска в фоновом потоке и не разместили пул автоматического выпуска, который позаботится о восстановлении объектов после их освобождения (количество выпусков == 0),это не происходит в главном потоке, потому что основной поток уже имеет пул, для фоновых потоков, которые вы порождаете, вы несете ответственность за настройку пула автоматического выпуска ... ваше решение - правильное решение проблемы ... так что вотпример того, когда и где использовать пул авто-релиза

Один из способов создания чего-либо для выполнения в фоновом режиме - это вызов метода executeSelectorInBackground объекта NSObject, который, как я полагаю, вы делаете

[myObject performSelectorInBackground:(@selector(myBackgroundMethod:) withObject:nil];

Теперь этометод будет выполняться в фоновом потоке, и вам нужно разместить пул авто-релиза, чтобы он не просочился, например,

   -(void)myBackgroundMethod:(id)sender
{
     NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
     //do stuff
     [pool release];

}

надеюсь, что это очистит

Даниэль

...