Program Tip

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

programtip 2020. 10. 24. 11:41
반응형

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


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

그랜드 센트럴 디스패치 대기열 내에 배치되고 메인 스레드가 아닌 스레드에서 실행되는 블록에 동일한 규칙이 적용됩니까? 즉, 메인 큐가 아닌 다른 것으로 보내는 각 블록 내에 NSAutoreleasePool을 만들어야합니까?

제한된 테스트에서 일반적으로 백그라운드 스레드 또는 NSOperations에서 볼 수있는 자동 릴리스 된 개체에 대한 콘솔 경고가 표시되지 않습니다. 그러나 나는 이것에 대한 확실한 문서를 찾을 수없는 것 같아서 누군가가 이것이 언급 된 곳을 지적 할 수 있는지 궁금합니다.


그랜드 센트럴 디스패치 대기열 내에 배치되고 메인 스레드가 아닌 스레드에서 실행되는 블록에 동일한 규칙이 적용됩니까? 즉, 메인 큐가 아닌 다른 것으로 보내는 각 블록 내에 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

반응형