2010-03-08 8 views
0

У меня есть приложение для iPhone со вторичным потоком для обработки разбора XML. Внутри некоторых из этих методов мне нужно ссылаться на словари (для поиска, а не изменения), созданные и заполненные в основном потоке.iPhone Простая связь между потоками

Документация Apple указала мне, что глобальные переменные могут быть лучшим способом для этого. Я просто сейчас знаю, как будет выглядеть реализация. Определить словари в верхней части .m и получить доступ к ним, как правило, внутри вторичного потока?

+0

Я должен добавить, что я попытался определить свой NSDictionary глобально в файле .m. Затем в моей вторичной теме, когда я пытаюсь (как тест) перебирать словарь и NSLog значениями, я получаю разные результаты. Иногда приложение не разбивается (но оно ничего не печатает). Иногда он корректно печатает от 1 до N значений перед сбоем. – Ternary

+2

Как вы создаете экземпляр глобального словаря? – jlehr

+0

Наверху моего .m это NSDictionary * foo; Затем внутри моего пользовательского init я заполняю его. Я могу сбросить словарь внутри этого метода, и все в порядке. Именно это заставило меня поверить, что это проблема нитей. – Ternary

ответ

1

NSDictionary является потокобезопасным, поэтому, вероятно, это не проблема с потоками, если ваш инициализатор не выделяет глобальный как NSMutableDictionary (не потокобезопасный), а затем вторичный поток пытается получить к нему доступ, пока он все еще заполняется.

(Если это так, то ваш инициализатор должен сначала выделить NSMutableDictionary в локальную переменную, заполнить ее, а затем скопировать готовую локального до глобального использования NSDictionary-х +dictionaryWithDictionary: или -initWithDictionary:.)

С другой стороны, это может быть что вы не сохраняете глобальное значение при его инициализации?

+0

Ничего себе. Я чувствую себя глупо. Добавив удержание вызова, он исправил его. Я использовал [NSDictionary dictionaryWithContentsofFile] для загрузки plist. Так как мой метод init заполнил словарь, а затем вышел, началась гонка между тем, как быстро был освобожден словарь и насколько быстро мой вторичный поток отправил содержимое в NSLog? Я думал, что словарьWithContentsofFile вернет сохраненную ссылку. Я думал, что мне нужно будет сохранить только явный alloc/init. Итак, каково лучшее эмпирическое правило о том, когда сохранить или нет? – Ternary

+0

На самом деле, это наоборот: alloc неявно сохраняется, и почти каждый другой метод (за исключением «нового» или «копии») возвращает объект с автореализацией, поэтому, если вы хотите, чтобы он оставался после вашего метода, вам нужно явно сохраняют его. За дополнительной информацией: http://developer.apple.com/Mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html –