Я действительно не знаю наверняка, что это проблема с потоками, но я не знаю, что еще может быть причиной моих проблем.У меня есть приложение для iOS с NSStreamDelegate, вызывающим
- (void) stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
. Делегат получает дескриптор для AppDelegate, и в любой другой части StreamDelegate существует AppDelegate.Однако в потоке: handleEvent: при попытке передать результаты обратно в AppDelegate для дополнительной обработки я получаю сообщение об ошибке EXC_BAD_ACCESS.
Единственная причина, по которой я думаю, что это может быть проблема с многопоточностью, заключается в том, что документацияon stream: handleEvent: states:
Делегат получает это сообщение только в том случае, если поток Stream запланирован в цикле выполнения.Сообщение отправляется в потоке объекта потока.Делегат должен проверить streamEvent, чтобы определить соответствующее действие, которое он должен предпринять.
Имеет ли «поток объекта потока» ссылку на мой StreamDelegate?Или это ссылка на поток, передаваемый в метод?Я предполагаю позже, но хочу убедиться, что я не ошибаюсь.
Если это иная нить, чем та, на которой сидит мой AppDelegate, то это то, что вызывает моюпроблемы?Если так, то как мне справиться с этим?
Редактировать : за @bbum, я обновляюсь, чтобы указать, что я сделал.
После взлома,Я попробовал кое-что, что я рассмотрел и затем отклонил.По сути, я создал фиктивный класс, который создается и вызывается из stream: handleEvent :.Я вызываю метод, который работает с:
[man performSelectorOnMainThread:@selector(saveEvent:) withObject:jsonDict waitUntilDone:YES];
Внутри saveEvent:, я перезваниваю в AppDelegate и (почти!) Все работает с этого момента.
В настоящее время у меня проблема с отладчиком, который жалуется на попытку записи в файл, который не существует.Я пока не знаю, почему это так.Имя файла выглядит подозрительно, как хешированный каталог, который создается для приложения под «iPhone Simulator / 5.0 / Applications /», но я не выяснил, где именно происходит ошибка.
ДействительноЗапутанная часть этого в том, что я просто не могу получить трассировку стека при любых сбоях.Я пытался использовать LLVM 3.0 и LLVM GCC 4.2 с соответствующими отладчиками, но ничего.Я использую Xcode 4.2.У меня не было этой проблемы с 4.1.
Спасибо за слова мудрости, @bbum.Очень признателен.Я выложу еще одно обновление, как только получу это полностью.
Редактировать (2011-10-18): [Обновление: неважно;Я идиот.Я читал поток в байтовом массиве, но не объявлял явный размер.Я столкнулся с каким-то переполнением буфера.Теперь все работает.]
Я уже несколько дней бью головой об стену, а затем переписываю код из-за вышеуказанных ошибок.Я снова почти на грани того, чтобы все заработало, но поток все еще, кажется, кусает меня в заднице.
Я получаю следующую ошибку:
предупреждение: Невозможно восстановить ранее выбранный кадр.
Я получаю данные в NSInputStream и записываю их, а затем пытаюсь обновить представление, чтобы указать обновление.В какой-то момент после того, как звонки сделаны, я должен увидеть вызов viewWillAppear: (BOOL) анимированный, но сначала появляется предупреждение выше, и приложение блокируется.
Я много гуглил на вышеупомянутоми обычно ошибка возникает, когда есть какой-то бесконечный цикл, переполнение стека или что-то, что забивает память.Я не вижу ничего подобного.Я все еще думаю, что сталкиваюсь с проблемой, когда мои потоки пересечены, и стек становится запутанным.Я просто не могу понять, почему.
Вызываемый выше селектор saveEvent: делает свое дело, а затем изменяет свойство в представлении, указывая, что оно грязное.Это свойство трогается.Я вижу, как это происходит, когда я ставлю перерыв.Но viewWillAppear: никогда не вызывается.
Это было до смешного разочарование. Это кажется такой простой вещью, но какой это был беспорядок.