2011-02-03 5 views
1

이것은 autorelease, Cocoa threads 및 NSOperationQueue에 대한 일반적인 질문입니다.NSOperationQueue를 사용하여 별도의 스레드에 자동 렌더링 된 객체 만들기

NSOperationQueue를 사용하여 특정 API 호출을 수행하고 결과를 구문 분석하여 주 스레드로 리턴합니다. NSOperationQueue는 새 스레드에 대해 이러한 작업을 수행합니다. 새 스레드가 시작될 때마다 올바르게 이해하면 스레드가 완료 될 때 해제되는이 스레드 주위에 자동 자동 릴리스 풀이 생성됩니다.

여기에 문제가되는 경우가 있습니다. NSOperationQueue 할당 된 NSArray를 전달합니다. 작업을 수행하는 동안 어레이는 자동으로 생성 된 많은 객체로 채워집니다. 그런 다음 배열은 주 스레드로 다시 반환됩니다.

  1. autoreleased 오브젝트가 스레드에서 작성되었으므로 할당 해제됩니까? 그들이 NSArray에 추가 된 후 ref 인수가 1이 아니 어서는 안된다는 것을 이해합니다.

  2. 누가이 개체를 소유하고 있습니까? autorelease가 마술처럼 메인 스레드 자동 풀 풀에 책임을 넘겼습니까?

  3. NSOperationQueue를 사용하는 대신 스레드를 직접 작성하는 경우에는 어떤 차이가 있습니까?

고맙습니다!

+0

여기에 비슷한 토론이 있습니다. http://stackoverflow.com/questions/184409/nsautoreleasepool-in-nsoperation-main 그러나 내 질문에 완전히 충실하지는 않습니다. – Alex

답변

0

NSOperation에는 NSAutoReleasePool이 필요합니다.

-(void)main 
{ 
    NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 

    //All NSOperation code here 

    [pool drain]; 
} 
  1. 것은 아니, 당신은 아마 기존없이 자동 해제 풀에 대한 콘솔에 경고를 얻을 것입니다. 어레이에 추가하면 ref 카운트가 1 씩 증가하지만 NSAutoReleasePool이 없으면 ref 카운트가 적절한 메모리 관리를 위해 너무 높습니다.
  2. 해당 스레드에 대한 자동 해제 풀을 생성하여 배수해야합니다. 메인 스레드에서 작업이 실행되고 있지 않으면 마술처럼 메인 스레드의 풀에 넣지 않습니다.
  3. 자동 풀 풀 생성에 대한 책임이있는 각 스레드가 없습니다.
+0

감사합니다 조 블로우 내 소유욕을 수정합니다. – Joe

+0

감사합니다. 2는 자식 스레드가 종료 될 때 ref>가 0 인 객체에 대한 책임을 주 스레드 자동 해제 풀로 전송하는 방법을 얻지 못합니다. 이것에 대해 생각하는 것이 잘못된 방법일까요? – Alex

+0

'- [NSAutoReleasePool drain]'을 호출하면 보존 된 객체를 적절히 역 참조 할 것이고 그 시점에서 보유 개수가 0 인 모든 객체는 할당 해제됩니다. – Joe

관련 문제