использование большой центральной диспетчеризации внутри метода класса приводит к утечке памяти - PullRequest
8 голосов
/ 23 марта 2011

Я получаю утечку памяти, когда контроллер представления вызывает мой метод класса модели в строке, где я создаю свою очередь gcd.Есть идеи?

+(void)myClassMethod {
    dispatch_queue_t myQueue = dispatch_queue_create("com.mysite.page", 0); //run with leak instrument points here as culprit
    dispatch_async(myQueue, ^{});
}

Ответы [ 2 ]

18 голосов
/ 23 марта 2011

Вы должны изменить его на ...

dispatch_queue_t myQueue = dispatch_queue_create("com.mysite.page", 0);
dispatch_async(myQueue, ^{});
dispatch_release(myQueue);

... вам следует звонить dispatch_release, когда вам больше не нужен доступ к очереди. И поскольку myQueue является локальной переменной, вы должны вызвать ее там.

Читать документацию dispatch_queue_create:

Обсуждение

Блоки, отправленные в очередь, выполняются по одному в порядке FIFO. Однако обратите внимание, что блоки, отправленные в независимые очереди, могут выполняться одновременно по отношению друг к другу.

Когда ваше приложение больше не нуждается в очереди отправки, оно должно освободить его с помощью функции dispatch_release. Любые ожидающие блоки, отправленные в очередь, содержат ссылку на эту очередь, поэтому очередь не освобождается до тех пор, пока не будут завершены все ожидающие блоки.

4 голосов
/ 23 марта 2011

Инструмент Leak сообщает, где выделена память, на которую больше нет ссылок из вашего кода.

После запуска этого метода, поскольку ничто не имеет ссылки на созданную вами очередь, а dispatch_release () никогда не вызывался, это считается утечкой.

...