Так і ні. В кінцевому підсумку ви випустили би рядок пам'яті, але "просочили" об'єкт NSAutoreleasePool в пам'ять, використовуючи drain замість звільнення, якщо ви запускали це в середовищі зібраного сміття (не керованого пам'яттю). Цей "витік" просто робить екземпляр NSAutoreleasePool "недосяжним", як і будь-який інший об'єкт без сильних покажчиків під GC, і об'єкт буде очищений під час наступного запуску GC, що цілком може бути безпосередньо після виклику -drain
:
стік
У середовищі зібраного сміття запускає збір сміття, якщо пам’ять, виділена після останнього збору, перевищує поточний поріг; інакше поводиться як звільнення. ... У сміттєвому середовищі цей метод, нарешті, вимагає objc_collect_if_needed
.
В іншому випадку це схоже на те, як -release
поводиться за межами GC, так. Як зазначали інші, -release
це заборона на використання в рамках GC, тому єдиний спосіб переконатися, що пул нормально функціонує під GC -drain
, а -drain
під не-GC працює точно так само, як -release
під не-GC, і, можливо, передає свою функціональність більш чітко, як Ну.
Я повинен зазначити, що у вашому вислові "будь-що, що викликається за допомогою new, alloc або init" не повинно бути "init" (але повинно містити "copy"), оскільки "init" не виділяє пам'ять, він лише встановлює об'єкт (конструктор мода). Якщо ви отримали виділений об'єкт, а ваша функція викликала лише init як таку, ви не випустили б його:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
Це не споживає більше пам’яті, ніж ви вже почали (припускаючи, що init не створює екземпляри об’єктів, але ви все одно за них не відповідаєте).