Когда автореферат действительно вызывает выпуск в Cocoa Touch?

Насколько я понимаю, вам нужно быть осторожным с autorelease на iOS. У меня есть метод, возвращающий объект it alloc, который нужен вызывающему, поэтому в этой ситуации - как я понимаю - мне нужно отправить autorelease в объект в вызываемом вызове, прежде чем он вернется.

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

Я прибегал к отправке сообщения retain от вызывающего, чтобы объект не был выпущен, а затем явно высвободил его в dealloc.

Это лучший подход?

Ответ 1

Пул авторезистов обычно освобождается после каждой итерации цикла запуска. Грубо, каждое приложение Cocoa и Cocoa Touch структурировано следующим образом:

Get the next message out of the queue
Create an autorelease pool
Dispatch the message (this is where your application does its work)
Drain the autorelease pool

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

Ответ 2

Использование autorelease - это способ сказать: "Объект, я больше не хочу вас, но я передам вам кого-нибудь, кто захочет вас, поэтому пока не исчезните". Таким образом, объект будет стоять достаточно долго, чтобы вы могли вернуть его из метода или передать его другому объекту. Когда какой-либо код хочет сохранить объект вокруг, он должен требовать права собственности на retain ing.

Смотрите рекомендации по управлению памятью для всего, что вам нужно знать, чтобы правильно использовать autorelease.

Ответ 3

Вот пример, приведенный в документе Apple Memory Management:

– (id)findMatchingObject:(id)anObject 
{ 
    id match = nil; 
    while (match == nil) { 
        NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init]; 
        /* Do a search that creates a lot of temporary objects. */ 
        match = [self expensiveSearchForObject:anObject]; 
        if (match != nil) { 
            [match retain]; /* Keep match around. */ 
        } 
        [subPool release]; 
    } 
    return [match autorelease];   /* Let match go and return it. */ 
}

Ответ 4

Да, это лучший подход. Автореферат действительно предназначен только для взаимодействия кода, который вы знаете. Как только вы храните объект, вы должны знать, что объект, содержащий ссылку, не будет умирать/выходить из области действия до тех пор, пока вы не сделаете это с объектом, или вам нужно сохранить объект.

Ответ 5

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