Забудьте пока ошибку self.delegate
, это красная сельдь, если [self class]
дает неправильный результат!Ваши результаты свидетельствуют о том, что вы каким-то образом ударяете self
.
Точка останова на webView:didFinishLoadForFrame:
проверьте значение self
и выполните шаг.1013 * То, что self ошибается в первом утверждении метода экземпляра, скажем, необычно (но не невозможно).
Когда объект задан как делегат другого, важно убедиться, что делегатВремя жизни объекта не менее того, для которого он выступает в качестве делегата.Введение ARC может привести к сбою ранее работающего кода, поскольку он может освободить делегата раньше, чем код выполнялся в MRC.Когда это происходит, вызов делегату обычно завершается неудачей.
Однако ваша ошибка не сбивается при вызове делегата;звонок начинается - вы заканчиваете webView:didFinishLoadForFrame:
- и затем обнаруживаете, что self
недействителен.Для фактического вызова метода экземпляра обычно требуется допустимое значение для self
, поскольку оно используется для определения реализации метода для вызова.Следовательно, self
обычно действует в начале метода!
Но обратите внимание на "обычно" ...
Так что, несмотря на то, что вы успешно достигли своего метода, ваша ошибкавозможно, из-за отсутствия сильной ссылки на ваш SubFoo
экземпляр, вы передаете его как делегат aWebView
, и к тому времени, когда webView:didFinishLoadForFrame:
называется, ваш SubFoo
исчез.
Makeуверен, что вы держите сильный реф на ваш SubFoo instance
.Если вы просто хотите проверить (это , а не рекомендуемое общее решение!), Если это ваша проблема, вы можете просто назначить ее локальной статической (static SubFoo *holdMe
скажем, объявленной внутри performRequest
) в performRequest
, которая будет держать сильную ссылку, по крайней мере, до следующего вызова performRequest
.Если это действительно является проблемой, вам нужно найти хороший способ сохранить ссылку, которая соответствует вашему дизайну.