문제

UI를 걸지 않도록 백그라운드에서 장기 실행 작업을 수행하기 위해 일부 스레드를 분리하는 iPhone 응용 프로그램을 구축하고 있습니다. 스레드는 메모리 관리를 위해서는 nsautoreleasepool 인스턴스가 필요하다는 것을 이해합니다. 내가 확실하지 않은 것은 스레드 메소드가 다른 메소드를 호출하는 경우 - 해당 메소드도 nsautoreleasepool도 필요합니까?

예제 코드 :

- (void)primaryMethod {
    [self performSelectorInBackground:@selector(threadedMethod) withObject:nil];
}

- (void)threadedMethod {
    NSAutoreleasePool *aPool = [[NSAutoreleasePool alloc] init];

    // Some code here

    [self anotherMethod];

    // Maybe more code here

    [aPool drain];
}

- (void)anotherMethod {
    // More code here
}

내가 묻는 이유는 객체가 수영장이 없어서 자동 입력되고 있다는 오류를 받고 있으며 "유일하게 새는 것"이기 때문입니다.

나는 사람들이 자동 제국 풀을 전혀 가지고 있지 않은 다른 질문을 보았으며, 왜 자동 제출 풀이 필요한지 이해합니다. 특히 자동 제출 풀이 생성되는지 여부를 찾는 데 관심이 있습니다 (이 예에서) threadedMethod 생성 된 개체에 적용됩니다 anotherMethod.

도움이 되었습니까?

해결책

귀하의 질문에 답하기 위해, 예, 또 다른 메드는 ThreadedMethod에서 만든 NSAutorEleasePool을 사용하고 있으며 APOOL이 석방/배수되면 자동 제출이 공개됩니다.

따라서이 코드에서 직접 오류가 발생하지 않을 것입니다 (더 많은 일이 발생하지 않는 한).

_NSAUTORELEASENOPOOL에 브레이크 포인트를 넣고 (브레이크 포인트 창에 이름으로 추가) 디버거에서 코드를 실행하면 AutorELEASE가 풀없이 호출되면 문제가 해결 될 때 중지됩니다.

다른 팁

예를 들어, NSAUTORELEASEPOOL은 [self anotherMethod] 내부에 중첩되어 있습니다.(void)threadedMethod.

  • Q : NSAUTORELEASEPOOL을 통과하는 방법?
  • A :에 따라 다릅니다.
    1. 중첩 된 호출을 가로 질러, 그렇습니다.
    2. 형제 보행 전반에 걸쳐, no.

그리고 무엇이든, NSAutoreleasePool 부모의 범위가 사라질 때 인스턴스 자체가 범위를 벗어납니다. -당신의 예에서, 바로 끝에 -(void)threadedMethod { }.

앞서 언급 한 기사 (http://thegothicparty.com/dev/macos/nsautoreleasepool/)는 그것에 대해 매우 분명합니다.

AutoreLease Pool은 다른 방법으로 운반됩니다. 그러나 스레드 기능이 종료되면 [Apool Drain] 대신 [APool Release]를 호출해야합니다. 그것들은 대략 동등하지만, apool 릴리스는 수영장의 다른 모든 개체와 더불어 nsautoreleasepool이 자체를 방출하게합니다. 드레인을 호출 한 후 나사산 기능이 종료되면 AutorELEASE 풀의 수는 여전히 +1입니다! 승률은 "그냥 누출"물체는 Apool입니다!

편집하다:

Jim Puls는 방출 및 배수가 동등한 것에 대해 옳습니다. Apple Docs는 비가 베이지 수집 환경에서 동일하다고 분명히 말하며 쓰레기 수집 된 경우 배수가 더 좋습니다. 문서를 읽지 않은 것에 대한 내 잘못!

다음은 nsautoreleasepools에 대한 일반적인 개요를 제시하는 기사입니다. 올바른 방향을 가리키는 데 도움이 될 것입니다. AutorELEASS 풀의 가상 스택이 있으므로 객체가 자동으로 표시되는 위치에 관계없이 앱 내 어디에서나 최상위 스택이 사용됩니다.

http://thegothicparty.com/dev/macos/nsautoreleasepool/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top