Я просто столкнулся с этой проблемой и решил ее. Для ARC решение состоит в том, чтобы использовать атрибут weak
вместо assign
.
Авария произошла потому, что делегат
- Имеет атрибут
assign
И
- был освобожден.
Решением является использование атрибута weak
, потому что когда объект освобождается, указатель WILL будет установлен на nil
. Поэтому, когда ваш код вызывает respondsToSelector
на nil
, Objective C будет игнорировать вызов, а не аварийно завершать работу.
В вашем коде, когда вы пытаетесь вызвать метод respondsToSelector
для delegate
, вы получаете EXC_BAD_ACCESS. Это связано с тем, что объекты, которые используют свойство assign
, не будут установлены в nil
, когда они освобождены. (Следовательно, почему выполнение !self.delegate
перед respondsToSelector
не препятствует вызову responseToSelector
для освобожденного объекта и все же приводит к сбою вашего кода)
Как уже упоминалось, использование атрибута strong
или assign
для делегата (как уже упоминалось) в ARC приведет к циклу сохранения. Так что не делай этого, тебе не нужно.