Портирование кода iOS3 на iOS5: проблемы с одиночками - PullRequest
0 голосов
/ 08 марта 2012

Я портирую код iOS3 на iOS5. Первоначально я использовал синглтон для глобального хранилища данных. Он предоставлял единственный экземпляр любых данных, которые мне были необходимы для доступа через контроллеры представления, и в основном он был заполнен данными, которые я извлекаю с сервера.

В версии для iOS3 я использовал единственную реализацию Мэтта Галлахера для своего хранилища данных. Однако в iOS5 я хочу использовать ARC, поэтому я перешел к реализации GCD Люка Редпата .

Теперь у меня проблемы с некоторым кодом, который извлекает данные сервера. В функции инициализации синглтона я пытаюсь заполнить синглтон, опрашивая мой сервер. Связь с сервером обрабатывается отдельным классом. Класс связи использует учетные данные, хранящиеся в синглтоне, и, похоже, я столкнулся с проблемой. Шагая по коду, моя серверная рутина завершается, когда я попадаю в строку кода, которая обращается к синглтону. Нет ошибок, нет предупреждений, процедура просто завершается, когда она попадает в одиночную линию доступа.

Синглтон работает правильно в других местах, поэтому я предполагаю, что это как-то связано с циклической ссылкой на синглтон (синглтон создает экземпляр класса сервера, который пытается получить доступ к синглтону).

На данный момент я не уверен, как поступить. Я бы предпочел не реструктурировать мой код для порта. Любые предложения относительно: а) в чем может заключаться моя проблема и б) других альтернатив для создания единого, глобально доступного экземпляра данных моего сервера?

EDITED

Использование Apple шаблона проектирования синглтона , как предлагает sosborn, вызывает проблемы со следующим блоком кода в процедуре инициализации моего синглтона.

// enable the location controller
locationController = [[LocationController alloc] init];
locationController.delegate = self;
[locationController.locationManager startUpdatingLocation];

В последней строке я получаю EXC_BAD_ACCESS с

warning: Unable to restore previously selected frame.

Полагаю, это проблема управления памятью. Основываясь на документации Apple, я не отменял ни одной из процедур управления памятью.

If you want a singleton instance (created and controlled by the class factory method) but also have the ability to create other instances as needed through allocation and initialization, do not override allocWithZone: and the other methods following it as shown in Listing 2-15.

Я сделал это неправильно?

Ответы [ 3 ]

0 голосов
/ 02 апреля 2012

Конечно, звучит как класс singleton, и его свойства еще не полностью готовы к использованию, когда вы их вызываете.

Вы упоминаете, что в методе init было много сетевых вещей.Есть ли вероятность того, что объект не будет полностью готов, когда вы его вызываете?

Если у вас есть длительный процесс, который нужно завершить, прежде чем вы сможете безопасно использовать объект, вы можете посмотреть на использование шаблона уведомления или делегата для запускаследующий шаг, когда все будет готово.

В случае, когда процесс бомбит без предупреждений, попробуйте использовать NSZombies для помощи в отладке.

0 голосов
/ 23 мая 2012

Мне так и не удалось полностью решить эту проблему.В конце концов я решил провести рефакторинг приложения, используя более новые блочные методы HTTP-запроса.

0 голосов
/ 08 марта 2012

Почему бы не использовать рекомендованный Apple код для синглетонов ?

...