семантика @autoreleasepool - PullRequest
       9

семантика @autoreleasepool

7 голосов
/ 18 октября 2011

Я читал документы ARC на сайте llvm: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool

.. в частности, о @ autoreleasepool.

Во многих текущих реализациях, использующих NSAutoreleasePool, я вижу случаи, когда пул периодически очищается во время итерации цикла - как мы делаем то же самое с пулом @autorelease, или все это делается для нас каким-то образом под капотом?

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

Кто-нибудь получил информацию об этих точках?

Ответы [ 2 ]

9 голосов
/ 18 октября 2011

Во многих текущих реализациях, использующих NSAutoreleasePool, я вижу случаи, когда пул периодически очищается во время итерации цикла - как мы делаем то же самое с пулом @autorelease, или все это делается для нас каким-то образом под капотом? *

Таким же образом, то есть путем каскадного пула авто-выпусков. Например:

@autoreleasepool {
    …
    for (int i = 0; i < MAX; i++) {
        @autoreleasepool {
            …
        }
    }
    …
}

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

В большинстве случаев программа не сможет корректно восстановиться из-за особой природы исключений в Какао, поэтому я бы сказал, что утечка объектов - это меньшая проблема. При выходе из блока @autoreleasepool из-за исключения соответствующие автоматически выпущенные объекты будут освобождены только при извлечении одного из включенных пулов автоматического выпуска. Но вы, конечно, можете поместить блоки @try/@catch/@finally внутрь блока @autoreleasepool, чтобы этого не произошло.

2 голосов
/ 18 октября 2011

как нам сделать то же самое с @autorelease pool

Примерно так:

for (int i = 0; i < 10000; i++) {
    @autoreleasepool {
        // Do your work here
        ...
    }
}

Во-вторых, документы утверждают, что если исключениеброшен, пул не опустошен .... хорошо, исключения по имени исключительны, но если они действительно случаются, вы можете восстановить без утечки памяти.

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

...