Я использую ручной подсчет ссылок и Xcode 4.5.
Я объявил ивар:
UIAccelerometer *accelerometer;
акселерометр НЕ был собственностью. И у меня был этот код в одном методе:
accelerometer = [UIAccelerometer sharedAccelerometer];
accelerometer.delegate = self;
Во втором методе у меня было:
accelerometer.delegate = nil;
и в другом методе, который запускается позже, у меня было:
accelerometer.delegate = self;
С этой настройкой я иногда (редко и, по-видимому, случайно) получал следующее прерывание:
'NSInvalidArgumentException', причина: '-[NSPathStore2 setDelegate:]: нераспознанный селектор отправлен экземпляру xxx
После большого разочарования в поисках причины этого прерывания я попытался установить удержание на акселерометр, когда он впервые использовался, и после этого прерываний не было. Но я беспокоюсь, что удержание не решило настоящую проблему. Причина, по которой я подумал об этом «решении», заключается в том, что сообщение о прерывании жаловалось на вызов setDelegate, а в части кода, которая казалась актуальной, единственный делегат, который я устанавливал, был на акселерометре. Но я не понимаю, почему это должно исправить это, и я беспокоюсь, что сохранение просто меняет код таким образом, чтобы скрыть проблему.
Я так понимаю, что
accelerometer = [UIAccelerometer sharedAccelerometer];
создает одноэлементный экземпляр, который будет иметь тот же адрес на протяжении всего экземпляра, в котором он находится, и этот адрес назначается акселерометру, который также существует на протяжении всего экземпляра. Если это так, то почему сохранение что-либо меняет?
Может ли одиночный элемент sharedAccelerometer быть освобожден до того, как экземпляр, в котором он находится, будет освобожден?