2009-10-23 6 views
2

Как узнать, откуда был вызван метод? Как вы видите в трассировке стека.Поиск метода, вызванного с

В принципе, просто для объяснения, я наблюдаю свойство основных данных и метод, вызываемый при изменении свойств вызывает другой метод (IBAction), но в этом IBAction он добавляет объекты Core Data, которые запускают метод KVO, который запускает IBAction и т. д. Вот почему я пытался выяснить, откуда был вызван метод, поэтому я мог остановить этот бесконечный цикл.

+0

Помогает ли класс StackTrace? – Beta

+2

В Cocoa нет класса StackTrace. – bbum

+0

Дубликат http://stackoverflow.com/questions/1373991 –

ответ

16

Вы не можете недолго переходить к дублированию функций отладчика, dtrace и/или других инструментов, которые делают именно такие вещи. Это замечательная архитектура, зависимая и изобилующая особыми случаями и ситуациями, которые не работают.

Вы, конечно, никогда бы не захотели сделать такое в производственном коде. Для отладки достаточно инструментов, которые делают это в достаточном контексте, что нет необходимости в этом.

Что вы пытаетесь сделать?

В основном я использую КВО и если метод KVO вызывается из другого метода, который является IBAction Я не что делать то, что обычно делать в противном случае он будет идти в петлю (связанный с моим предыдущим вопросом).

На этом пути лежит безумие. Он полностью разрушает инкапсуляцию, чтобы иметь метод, на выполнение которого влияет вызывающий объект, не будучи каким-то явным аргументом или неявной конфигурацией, указывающей на то, что поведение должно измениться.

Если вы закончите бесконечный цикл, я предлагаю пересмотреть общую архитектуру.

В частности, когда возникает уведомление KVO, оно должно почти никогда не запускает уведомление KVO о том же свойстве прямо или косвенно. В чрезвычайно редком случае, когда это неизбежно, вы должны убедиться, что вы запускаете триггеры KVO вручную, используя -willChangeValueForKey: и -didChangeValueForKey: условно.

В принципе, просто объяснить, я наблюдение свойства ядра данных и метода, который вызывается, когда изменения свойств вызывает другой метод (IBAction), но в этом IBAction он добавляет объекты основных данных, который вызывает метод KVO, который запускает IBAction и так далее. Вот почему я пытался выяснить, где метод был вызван из так что я мог бы остановить этот бесконечный цикл

Другими словами, вы должны изменить модель слоя, который затем вызывает метод в интерфейсе между слоем представления и уровнем управления (метод IBAction), который, что неудивительно, вызывает другое изменение уровня модели, которое затем отключается от рельсов ....

Как только ваш наблюдатель загорается, и вам нужно внести изменения в модель в результате вы должны сохранить всю логику изменений на уровне модели. В конце концов, это ваша модель, и у нее должно быть умение применять изменения соответствующим образом.

Что никогда не должно происходить, так это то, что уровень управления или уровень просмотра запускают изменения модели в ответ на изменение модели. Изменения в модели - к данным - с уровня управления/просмотра должны происходят только в ответ на действие пользователя или какое-то внешнее событие (таймер, возможно).

+0

В основном я использую KVO, и если метод KVO запускается из другого метода, который является IBAction, я не делаю то, что он обычно делает, иначе он перейдет в цикл (связанный с моим предыдущим вопросом). – Joshua

+11

Вниз по этому пути лежит безумие, поскольку оно полностью нарушает обход. Вы действительно не хотите идти с шаблонами проектирования, где * вызывающий * прозрачно изменяет поведение * вызываемого. – bbum

+0

В принципе, просто для объяснения, я наблюдаю свойство основных данных и метод, вызываемый при изменении свойств, вызывает другой метод (IBAction), но в этом IBAction он добавляет объекты Core Data, которые запускают метод KVO, который запускает IBAction и так далее. Вот почему я пытался выяснить, откуда был вызван метод, поэтому я мог остановить этот бесконечный цикл. – Joshua

Смежные вопросы