тупик semaphore_wait_signal_trap в _class_initialize в приложении iOS - PullRequest
2 голосов
/ 01 апреля 2011

Один из моих управляемых объектов сущности должен настроить древовидную структуру только для времени выполнения, где узлы являются подклассами NSObject (они не являются управляемыми объектами).

Я настраиваю эту структуру (и, таким образом, выделяю кучу этих узлов) в двух местах:

  • при создании нового такого управляемого объекта: все работает нормально.
  • при чтении существующего управляемого объекта в методе awakeFromFetch.

Вот где у меня проблема: звонок на Node *newNode = [Node alloc]; никогда не возвращается. Я могу сломаться с помощью отладчика, и код застрял в semaphore_wait_signal_trap. Вот полный стек вызовов:

#0  0x937ac0e2 in semaphore_wait_signal_trap ()
#1  0x937b1be6 in pthread_mutex_lock ()
#2  0x01881c73 in _class_initialize ()
#3  0x0188973f in prepareForMethodLookup ()
#4  0x01880069 in lookUpMethod ()
#5  0x018801d6 in _class_lookupMethodAndLoadCache ()
#6  0x018930e3 in objc_msgSend ()
#7  0x000957d8 in -[MyEntity awakeFromFetch] at MyEntity:114

Так что, похоже, мой класс Node не удалось инициализировать. Действительно, это самое первое использование класса Node в этом сеансе. Чтобы проверить это, я вставил ложное выделение одного Node во время запуска приложения. Это вызывает успешно, и теперь вышеупомянутая проблема исчезает.

Однако я не удовлетворен по двум причинам:

1- Я до сих пор не понимаю, почему выделение Node в первый раз за awakeFromFetch не удается. И я не считаю, что ошибка исправлена, если я не понимаю, почему она произошла и почему это исправление.

2 - приложение теперь падает немного позже при использовании другого класса в первый раз, на этот раз не в любом awakeFromFetch.

Очевидно, что моя проблема не связана ни с awakeFromFetch, ни с Базовыми данными. Почему-то моя среда выполнения Objective-C работает неправильно, я не знаю почему.

Простой вопрос: что может привести _class_initialize к тупику p-thread?

Действительно, поиск в Google для semaphore_wait_signal_trap дает много хитов, все они связаны с pthreads, и немногие - с iOS / Objective-C / Cocoa.

Обратите внимание, что здесь я вообще не использую темы.

Я озадачен. Есть идеи, как это отладить?

Редактировать: исходная строка, которая никогда не возвращается, была:

Node *newNode = [[Node alloc] init];

Чтобы узнать, что происходит, я разделил его на две части:

Node *newNode = [Node alloc];
newNode = [newNode init];

Проблема возникает в первой из этих двух строк.

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Документ Apple о - [NSManagedObject awakeFromFetch] сказал, что:

Важно : подклассы должны вызывать реализацию super перед выполнением собственной инициализации.

Ты это сделал?

Однако, даже если это решит вашу проблему, я не знаю почему;)

0 голосов
/ 26 апреля 2011

Ну, я очистил все свои цели и восстановил.Без улучшения.Затем я удалил каталог производных данных XCode, и вот, проблема ушла.

Разумный вывод - предположить некоторый глюк /, но в Xcode 4.

Я даже не буду пытатьсяучитывать все потерянные часы.

...