Да и нет. В конечном итоге вы освобождали бы строковую память, но «просачивали» объект NSAutoreleasePool в память, используя слив вместо освобождения, если вы запускали это в среде со сборкой мусора (не управляемой памятью). Эта «утечка» просто делает экземпляр NSAutoreleasePool «недоступным», как и любой другой объект без сильных указателей в GC, и этот объект будет очищен при следующем запуске GC, что вполне может быть сразу после вызова -drain
:
Сливной
В среде сборки мусора запускает сборку мусора, если память выделена с момента последней сборки, больше текущего порога; иначе ведет себя как выпуск.
...
В среде со сборщиком мусора этот метод в конечном итоге вызывает objc_collect_if_needed
.
В остальном, это похоже на то, как -release
ведет себя не в GC, да. Как уже говорили другие, -release
не используется в GC, поэтому единственный способ убедиться, что пул правильно работает в GC, - через -drain
, а -drain
в не-GC работает точно так же, как -release
в не-GC, и, возможно, более четко передает свою функциональность.
Я должен отметить, что ваше утверждение «все, что вызывается с new, alloc или init» не должно включать «init» (но должно включать «copy»), потому что «init» не выделяет память, он только устанавливает объект (конструктор моды). Если вы получили объект alloc'd и ваша функция вызывала только init как таковой, вы бы не выпустили его:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
Это не потребляет больше памяти, чем вы уже начали (при условии, что init не создает экземпляры объектов, но вы все равно не отвечаете за них).