Сохранить ivar, который содержит указатель на [UIAccelerometer sharedAccelerometer]?

Я использую ручной подсчет ссылок и 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 быть освобожден до того, как экземпляр, в котором он находится, будет освобожден?


person RobertL    schedule 12.10.2012    source источник
comment
Извините, но похоже, что обратная связь сегодня не работает. Я редактировал это 3 раза, чтобы изменить обратную сторону, но не могу заставить его выглядеть правильно. Все мои обратные ссылки находятся на отдельных строках, но иногда они появляются здесь без новой строки.   -  person RobertL    schedule 12.10.2012
comment
Вы не думали о переходе на ARC? Ручной подсчет ссылок утомителен и подвержен ошибкам.   -  person nielsbot    schedule 12.10.2012
comment
Да, но сейчас не время. В этой игре уже 10 000 строк кода, большая часть из которых написана более одного раза, плюс 170 png-файлов, и мне нужно выпустить их как можно скорее. Теперь он кажется солидным, поэтому я не хочу вносить ненужные изменения. Если у него будет много пользователей, я перейду на ARC для обновлений.   -  person RobertL    schedule 12.10.2012
comment
ну, для такого большого проекта переход на ARC может быть болезненным ... Я просто говорю это, потому что чувствую, что вижу так много вопросов о SO, где люди начинают новые проекты без ARC.   -  person nielsbot    schedule 12.10.2012
comment
исправлено ваше форматирование BTW. Обратная галочка предназначена для цитирования встроенного кода. Для блоков кода начинайте каждую строку с 4 пробелов.   -  person nielsbot    schedule 12.10.2012


Ответы (1)


Если акселерометр является ivar, правильно сохранить любой объект, который вы туда поместили... Итак, этот код

accelerometer = [UIAccelerometer sharedAccelerometer];
accelerometer.delegate = self;

Должно быть

accelerometer = [ [ UIAccelerometer sharedAccelerometer ] retain ] ;
accelerometer.delegate = self;

И в -dealloc добавьте

[ accelerometer release ] ;
accelerometer = nil ;
person nielsbot    schedule 12.10.2012