Как мне справиться с возможной утечкой памяти из-за исключения в Objective-C? - PullRequest
3 голосов
/ 21 июня 2010

У меня есть метод, который выделяет объект, а затем освобождает его в конце. Между тем, метод вызывает другой метод, который может вызвать исключение, и исключение, вероятно, будет перехвачено методом, вызывающим мой метод. Если это произойдет, объект никогда не будет выпущен (или это будет?). Как я должен предотвратить это?

Ответы [ 2 ]

2 голосов
/ 21 июня 2010

Не выбрасывать исключения ни для чего, кроме фатальных, невосстановимых, ошибок

Это шаблон проектирования Какао, используемый в рамках и системе. Если вы решили, что хотите использовать исключения для управления потоком, то:

  • вы идете против паттерна Какао, и ваш код будет не соответствовать системным API

  • , если в системных рамках, в которых было сгенерировано исключение, любые кадры, эти структуры останутся в неопределенном состоянии

Исключения в Mac OS X и iOS используются только для указания ошибки программиста ; чтобы указать, что приложение вошло в состояние, восстановление которого невозможно. Не тратьте свое время на поддержку исключений, выходящих за пределы этого режима, вы просто будете тратить свое время и создавать код, который не работает как системные платформы.

Обратите внимание, что исключение на iOS на самом деле довольно дорого (и процессор, и память). Кроме того, @finally также не предоставляется бесплатно, хотя издержки @finally относительно незначительны.

2 голосов
/ 21 июня 2010

Вы всегда можете автоматически разблокировать его перед вызовом методов, которые, возможно, выдают - таким образом, вы можете быть уверены, что он будет выпущен, когда будет сгенерировано исключение.

Если по какой-то причине это не имеет смысла, вы можете сделать релиз в @finally блоке 1 :

Блок @finally содержит код, который должен быть выполнен независимо от того, сгенерировано исключение или нет.

Обратите внимание, что использование блока @finally без @catch хорошо:

Resource *resource = [[Resource alloc] init];
@try {
    [obj someMethodThatMayThrow];
}
@finally {
    [resource release];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...