Я портирую код 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.
Я сделал это неправильно?