2012-02-09 16 views
16

Rozważmy następujący przykład:Czy @autoreleasepool {} wyczerpuje się po powrocie/wyjściu wcześniej?

- (void)doSomething { 
    @autoreleasepool { 
     if (someCondition) { 

     /* ... allocate some autoreleased objects here ... */ 

     return; 
     } 
    } 
} 

Wcześniej z ręcznymi NSAutoreleasePools, jeśli wróciliśmy wcześnie, musieliśmy zadzwonić [pool drain], w przeciwnym razie nie byłby basen opróżniany. Dzięki nowej @autoreleasepool {}

+0

http://stackoverflow.com/questions/5083216/return-statement-inside-nsautoreleasepool-scope –

+1

nie mogłem znaleźć odpowiedzi na tyle szybko na interwebs, dlatego Pytam i odpowiadam w tym samym czasie ... –

Odpowiedz

14

odpowiedź jest TAK:

Kiedy blok jest zakończony normalnie, czy przez fallthrough lub ukierunkowany strumień sterujący (taki jak zwrot lub uszkodzenia), basen autorelease powraca do zapisane stan, zwalniając wszystkie znajdujące się w nim obiekty. Po wyjściu bloku z wyjątkiem, pula nie jest opróżniona.

Źródło: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool