programing

GCD의 블록 내에 NSAutorelease Pool을 만들어야 합니까?

mailnote 2023. 9. 13. 22:53
반응형

GCD의 블록 내에 NSAutorelease Pool을 만들어야 합니까?

일반적으로 NSOperationQueue에서 백그라운드 스레드를 생성하거나 NSOperation을 실행하는 경우 기본적으로 해당 스레드나 작업에 대한 NSAutoreleasePool을 만들어야 합니다.

Grand Central Dispatch 대기열 내에 배치되고 비메인 스레드에서 실행되는 블록에도 동일한 규칙이 적용됩니까?즉, 메인 큐 이외의 다른 블록에 디스패치하는 각 블록 내에 NSAutoreleasePool을 만들어야 합니까?

제한된 테스트에서는 백그라운드 스레드나 NSO 작업에서 일반적으로 볼 수 있는 자동 릴리스 개체에 대한 콘솔 경고가 나타나지 않습니다.그런데 이 부분에 대해서는 확정적인 자료를 찾을 수가 없는 것 같아서 이것이 어디에 적혀있는지 누가 지적해줄 수 있을까 해서요.

Grand Central Dispatch 대기열 내에 배치되고 비메인 스레드에서 실행되는 블록에도 동일한 규칙이 적용됩니까?즉, 메인 큐 이외의 다른 블록에 디스패치하는 각 블록 내에 NSAutoreleasePool을 만들어야 합니까?

그랜드 중앙 디스패치는 큐당 자동 릴리스 풀을 자동으로 관리합니다.그러나 풀의 배수 시기에 대한 보장은 없습니다. 한 블록이 처리된 후일 수도 있고 수백 블록이 지난 후일 수도 있습니다(그렇지 않을 수도 있습니다).

따라서 몇 개의 개체만 할당하는 경우에는 걱정하지 마십시오.그러나 상당한 수의 개체를 할당하는 경우(메모리 제한 환경을 대상으로 하는 경우)에는 풀을 생성하고 제거해야 합니다.


문서가 업데이트 되었습니다.

https://developer.apple.com/library/content/documentation/General/Conceptual/ConcurrencyProgrammingGuide/OperationQueues/OperationQueues.html #//apple_ref/doc/uid/TP40008091-CH102-SW1 참조

블록에서 Objective-C 개체를 여러 개 생성하는 경우 해당 개체에 대한 메모리 관리를 처리하기 위해 블록의 코드 일부를 @autorelease 블록에 포함할 수 있습니다.GCD 디스패치 큐에는 자체 자동 릴리스 풀이 있지만 해당 풀의 배수 시점에 대해서는 보장하지 않습니다.응용 프로그램이 메모리 제약 상태인 경우, 자신만의 자동 해제 풀을 생성하면 보다 규칙적인 간격으로 자동 해제된 개체에 대한 메모리를 확보할 수 있습니다.

언급URL : https://stackoverflow.com/questions/4141123/do-you-need-to-create-an-nsautoreleasepool-within-a-block-in-gcd

반응형