То, как вы объявляете указатель, очень мало связано с типом объекта, к которому обращается указатель. Objective-C очень слабо типизирован, и вы можете присвоить, например, адрес UIViewController указателю NSString, при условии, что вы запутываете присваивание, чтобы очень слабая проверка типов в компиляторе не жаловалась.
Таким образом, вы можете назначить адрес NSArray указателю NSIndexPath, и ничего не произойдет, пока вы не попытаетесь использовать значение.
Кроме того, как предположил Александр, если вы не можете сохранить что-то, что должно быть сохранено, объект «позади» адреса может быть освобожден, а затем перераспределен как нечто совершенно иное. (Эта проблема особенно зависит от времени / сценария и может привести к коду, который, например, работает на эмуляторе, но не работает на оборудовании.)
У меня вчера была очень похожая проблема (ошибка в каком-то старом коде, написанном кем-то другим, который таинственным образом начал давать сбой). Я закончил тем, что NSLog указывал description
и retainCount
указателя в нескольких местах кода, чтобы определить, при каких обстоятельствах он изменялся и почему. (Проблема была в том, что свойство неправильно объявлено assign
в другом классе.)