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

StackOverflow https://stackoverflow.com/questions/673372

Вопрос

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

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

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

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

Это было полезно?

Решение

Пул автоматического выпуска обычно освобождается после каждой итерации цикла выполнения.Грубо говоря, каждое приложение 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

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

Другие советы

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

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

Вот пример, приведенный в документ 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. */ 
}

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top