2010-09-28 2 views
0

Как раз тогда, когда я думал, что полностью понял эту тему, я вернулся к основам.Методы, которые вызывают методы: основы Autorelease?

У меня есть метод, который создает экземпляр autoreleased объект, используя (например) stringWithFormat:

return [NSString stringWithFormat:@"what"]; 

Затем я называю этот метод из другого метода, а другой метод, каждый раз возвращать autoreleased NSString и в каждом уровень иерархии. Код работает нормально, и экземпляр NSString неповрежден на каждом уровне иерархии.

Я подумал что, так как экземпляр autoreleased, он может внезапно закончиться с retainCount из 0 в любой точке в стеке вызовов (то есть, один из методов будет работать на выпущенном объекта). Верно ли, что я не могу зависеть от этого объекта?

Редактировать: Я понимаю, что вопрос был не слишком ясным. Сожалею. Я имею в виду:

Method1 ---calls---> Method2 ---calls---> Method3 ---instantiates the string---> 
+0

Вы, вероятно, никогда не увидите счет сохранения 0. Если у объекта есть значение удержания 1 при вызове выпуска, оно освобождается, а не уменьшается на счет сохранения. Кроме того, в примере stringWithFormat может быть достаточно умным, чтобы возвращать литерал, прошедший через него, поскольку в нем нет спецификаторов формата. – JeremyP

+0

@JeremyP, хорошая точка о том, что показатели сохранения никогда не достигают нуля. С другой стороны, мой первоначальный пример был фактически «return @», что «;», что и в этом примере, я думаю. –

ответ

1

Можно с уверенностью предположить, что автореализованный объект не будет удален в кадре стека под рамкой, в которой он был выделен. Таким образом, в стеке вызовов, как

method1 
    method2 <== instance allocated/autoreleased here 
    method3 <== safe to use here 

безопасно предположить экземпляр Alloc/autoreleased в method2 действует в method3, если вы играете пакости и осушить бассейн, созданный в method1 из method3. Это связано с тем, что пул авторезистов в более высоком кадре нельзя слить (если только глупостью) в нижнем фрейме. Конечно, как только управление возвращается к методу 1, все ставки отключены.

Пулы автораспределения alloc'd в нижнем фрейме не будут содержать экземпляр, автореализованный в методе2, потому что они не могли быть активным пулом (они еще не были созданы!) Во время авторекламы.

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

+0

Все еще отличный ответ. Благодарю. –

4

Ответ в том, что NSAutoreleasePool сливают после всех вызовов метода, и вы снова в цикле выполнения. Это означает, что в стеке вызовов объект не будет выпущен до тех пор, пока вы не вернетесь в цикл выполнения.

+0

Является ли это гарантией, если я не истощаю пул авторефератов, или просто случается так, что происходит? –

+2

Это фундаментальная гарантия. Пулы авторефератов не автоматизируются. Если бы они это сделали, само понятие автореализованного объекта было бы полностью сломанным и непригодным для использования. – bbum

+1

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

Смежные вопросы