Один из моих управляемых объектов сущности должен настроить древовидную структуру только для времени выполнения, где узлы являются подклассами 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];
Проблема возникает в первой из этих двух строк.