Цель-c: узнать, была ли выделена область памяти
Я реализовал загрузчик для проектов iOS. Он принимает запросы и, когда загрузка завершена, отвечает на цель делегатом. Он асинхронный, и цель (очевидно) является слабой ссылкой, поэтому, когда загрузка завершена, если цель больше не выделена, у меня появляется bad_acces. Я решил добавить метод (вызываемый, когда объект, который его использует, освобождается), который ищет цель во всех запросах и устанавливает ее равной nil. Это так далеко от того поведения, которое я хотел (полностью независим от других объектов: если загрузка больше не запрашивается, она будет кэширована: у нее нет способа остановить загрузку, а есть только очередь с приоритетами). Существует безопасный способ узнать, указатель все еще указывает на действительный адрес памяти?
3 ответа
Отвечая на ваш вопрос, нет хорошего способа узнать, что указатель все еще действителен (кроме зомби, которые не являются решением для производственной среды, а просто инструментом для тестовой среды). Но вместо того, чтобы беспокоиться о том, "как я узнаю, является ли это висячий указатель или нет", вы просто не должны допустить появления висячих указателей.
Когда ваш загрузчик был создан, вы предположительно указали делегата. Когда объект, который является делегатом, собирается исчезнуть (например, в его dealloc
), он должен сказать загрузчику установить его свойство делегата nil
, таким образом, устраняя висячий указатель.
Профилируйте свой код. Используйте инструменты специально для проверки утечек памяти. Кроме того, используйте Анализ, чтобы обнаружить потенциально проблемные части. Используйте различные инструменты, они очень помогают в разработке.
Просто взглянув на место в памяти, на которое указывает указатель, не существует безопасного способа узнать, указывает ли он на действительную память (без написания собственного менеджера памяти).
Почему бы не сохранить / освободить делегата в вашем коде? Это был бы правильный способ спроектировать это. Также предоставьте пользователям, которым ваш код, методы удаления себя из списка делегатов.