Вы не можете недолго переходить к дублированию функций отладчика, dtrace и/или других инструментов, которые делают именно такие вещи. Это замечательная архитектура, зависимая и изобилующая особыми случаями и ситуациями, которые не работают.
Вы, конечно, никогда бы не захотели сделать такое в производственном коде. Для отладки достаточно инструментов, которые делают это в достаточном контексте, что нет необходимости в этом.
Что вы пытаетесь сделать?
В основном я использую КВО и если метод KVO вызывается из другого метода, который является IBAction Я не что делать то, что обычно делать в противном случае он будет идти в петлю (связанный с моим предыдущим вопросом).
На этом пути лежит безумие. Он полностью разрушает инкапсуляцию, чтобы иметь метод, на выполнение которого влияет вызывающий объект, не будучи каким-то явным аргументом или неявной конфигурацией, указывающей на то, что поведение должно измениться.
Если вы закончите бесконечный цикл, я предлагаю пересмотреть общую архитектуру.
В частности, когда возникает уведомление KVO, оно должно почти никогда не запускает уведомление KVO о том же свойстве прямо или косвенно. В чрезвычайно редком случае, когда это неизбежно, вы должны убедиться, что вы запускаете триггеры KVO вручную, используя -willChangeValueForKey:
и -didChangeValueForKey:
условно.
В принципе, просто объяснить, я наблюдение свойства ядра данных и метода, который вызывается, когда изменения свойств вызывает другой метод (IBAction), но в этом IBAction он добавляет объекты основных данных, который вызывает метод KVO, который запускает IBAction и так далее. Вот почему я пытался выяснить, где метод был вызван из так что я мог бы остановить этот бесконечный цикл
Другими словами, вы должны изменить модель слоя, который затем вызывает метод в интерфейсе между слоем представления и уровнем управления (метод IBAction), который, что неудивительно, вызывает другое изменение уровня модели, которое затем отключается от рельсов ....
Как только ваш наблюдатель загорается, и вам нужно внести изменения в модель в результате вы должны сохранить всю логику изменений на уровне модели. В конце концов, это ваша модель, и у нее должно быть умение применять изменения соответствующим образом.
Что никогда не должно происходить, так это то, что уровень управления или уровень просмотра запускают изменения модели в ответ на изменение модели. Изменения в модели - к данным - с уровня управления/просмотра должны происходят только в ответ на действие пользователя или какое-то внешнее событие (таймер, возможно).
Помогает ли класс StackTrace? – Beta
В Cocoa нет класса StackTrace. – bbum
Дубликат http://stackoverflow.com/questions/1373991 –