Удалить ничего не удаляет - он просто отмечает, что память «свободна для повторного использования». До тех пор, пока некоторые другие вызовы выделения не будут зарезервированы и заполнят это пространство, у него будут старые данные. Однако, полагаясь на то, что это большой нет-нет, в основном, если вы удаляете что-то забыть об этом.
Один из методов в этом отношении, который часто встречается в библиотеках, - это функция Delete:
template< class T > void Delete( T*& pointer )
{
delete pointer;
pointer = NULL;
}
Это предотвращает случайный доступ к недопустимой памяти.
Обратите внимание, что вполне нормально называть delete NULL;
.
Вы можете использовать Unmanaged
тип для обхода ARC для определенных объектов. Я не очень много пробовал, но я думаю, что это будет выглядеть примерно так:
Unmanaged
: let unmanagedObj = Unmanaged.passRetained(obj)
Unmanaged
вокруг не приведет к накладным расходам ссылок. Когда вам нужно использовать объект, извлеките его так: let obj = unmanagedObj.takeUnretainedValue()
unmanagedObj.release()
Конечно, это работает только до тех пор, пока вы контролируете функции, необходимые для передачи объекта, потому что вы должны изменить их на выбор объекта на значение Unmanaged
. Я не знаю, так ли это для вас.
Возможно, вы можете выяснить, какие типы объектов вызывают наибольшую нагрузку на подсчет ссылок в вашем коде, переключив различные части графика объекта на Unmanaged
.