Методы, которые вызывают методы: основы авто-релиза? - PullRequest
0 голосов
/ 29 сентября 2010

Как только я подумал, что полностью понял эту тему, я вернулся к основам.

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

return [NSString stringWithFormat:@"what"];

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 29 сентября 2010

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

1 голос
/ 29 сентября 2010

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

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

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

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

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

...