2011-08-25 2 views
0

iOS 용 프로젝트를 컴파일 할 때 다음 오류와 같은 오류 목록이 표시됩니다.런타임 오류 : __NSAutoreleaseNoPool() : ... 풀이 없음으로 자동 릴리스 됨 - 방금 누출 됨

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 추가 하시겠습니까?

답변

2

백그라운드 스레드에서 start 메소드를 실행 중이며 해제 된 객체를 다시 확보하는 자동 복구 풀을 배치하지 않았기 때문에 콘솔에 메시지가 표시됩니다 (릴리스 수 == 0). , 메인 스레드가 이미 백그라운드 스레드에 대한 장소에 풀을 가지고 있기 때문에 당신은 autorelease 풀을 설정하는 책임이 있습니다 ... 당신의 솔루션은 문제에 대한 올바른 해결책입니다. 오토 릴리즈 풀을 백그라운드에서 실행하는 무언가를 생성하는

방법 중 하나를 사용하는 경우에 어디의 예는

을하고 난 가정 NSObject의의 performSelectorInBackground 메소드를 호출하는 것입니다
[myObject performSelectorInBackground:(@selector(myBackgroundMethod:) withObject:nil]; 

지금이 방법은 백그라운드 스레드에서 실행하는 것입니다 그리고 당신은

그것을 정리할 그래서

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

} 

희망처럼, 그것은 누설하지 위해서는 장소에 오토 릴리즈 풀을 배치해야

Daniel

+0

감사합니다.하지만 Autorelease 풀을 어디에 배치해야합니까? 나는 우리가 그들을 어디로 평상시에 두어야 하는지를 뜻합니다. 죄송합니다 대답은 분명하지만 아이폰 OS dev에 새로운 해요. – Anila

+0

수정 사항을 확인하십시오. – Daniel

관련 문제