Отслеживание чрезмерного удержания / освобождения в Swift

Удалить ничего не удаляет - он просто отмечает, что память «свободна для повторного использования». До тех пор, пока некоторые другие вызовы выделения не будут зарезервированы и заполнят это пространство, у него будут старые данные. Однако, полагаясь на то, что это большой нет-нет, в основном, если вы удаляете что-то забыть об этом.

Один из методов в этом отношении, который часто встречается в библиотеках, - это функция Delete:

template< class T > void Delete( T*& pointer )
{
    delete pointer;
    pointer = NULL;
}

Это предотвращает случайный доступ к недопустимой памяти.

Обратите внимание, что вполне нормально называть delete NULL;.

0
задан Simon Lundberg 13 July 2018 в 21:32
поделиться

1 ответ

Вы можете использовать Unmanaged тип для обхода ARC для определенных объектов. Я не очень много пробовал, но я думаю, что это будет выглядеть примерно так:

  1. Перед критическим критическим разделом оберните объекты, для которых вы хотите пропустить ARC в значениях Unmanaged :
    let unmanagedObj = Unmanaged.passRetained(obj)
    
  2. Внутри критического раздела передача значения Unmanaged вокруг не приведет к накладным расходам ссылок. Когда вам нужно использовать объект, извлеките его так:
    let obj = unmanagedObj.takeUnretainedValue()
    
  3. После критического раздела отпустите объект:
    unmanagedObj.release()
    

Конечно, это работает только до тех пор, пока вы контролируете функции, необходимые для передачи объекта, потому что вы должны изменить их на выбор объекта на значение Unmanaged. Я не знаю, так ли это для вас.

Возможно, вы можете выяснить, какие типы объектов вызывают наибольшую нагрузку на подсчет ссылок в вашем коде, переключив различные части графика объекта на Unmanaged.

0
ответ дан Ole Begemann 17 August 2018 в 12:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: