Почему "try catch" в Objective-C вызывает утечку памяти?

Я думаю о плюсах и минусах Try-Catch в Objective-C. Согласно этой статье, рассеивание мифов об NSException в iOS: можем ли мы использовать @try…@catch, @finally? try-catch не так уж и плох, за исключением утечки памяти в ARC.

Так как же try-catch вызывает утечку памяти?

1 ответ

Решение

Прежде всего: исключения имеют различную семантику в Objective-C. Исключение означает, что что-то пошло не так из-за ошибки программирования, и дальнейшее выполнение приложения бесполезно. Прекрати это! Для обработки "ожидаемых ошибок" (таких как недостаточный ввод данных пользователем или не отвечающие серверы и др.) Используйте шаблон обработки ошибок Cocoa. (Причина этого в том, что исключения кажутся удобными во многих ситуациях, но их очень трудно обрабатывать в других ситуациях, например, во время конструирования объекта. Прочитайте об исключениях в C++. Это больно.)

К вашему Q: ARC добавляет дополнительный код для управления памятью. Этот код должен быть выполнен для управления памятью, особенно выпустить объекты. Если исключение происходит до того, как это будет сделано, поток управления никогда не достигнет оператора release. Утечки памяти.

- (void)method
{
   id reference = …;
   // Some ARC code to retain the object, reference points to.
   … 
   @throw …
   …
   // reference loses its extent, because of method termination
   // Some ARC code to release the object, reference points to.
}

Если у вас есть исключение, метод немедленно покидается, и код ARC и конец метода для освобождения объекта никогда не выполняются. Это утечка.

Вы можете изменить это поведение, скомпилировав источник с -fobjc-arc-exceptions вариант.

http://clang.llvm.org/docs/AutomaticReferenceCounting.html

Это добавит код, чтобы сделать ARC-исключение безопасным, вызывая штраф за время выполнения. Но в разработке Какао нет особых причин, как объяснялось в начале этого ответа.

Другие вопросы по тегам