我如何找出调用方法的位置?就像你在堆栈跟踪中看到的一样。
基本上,只是为了解释,我正在观察一个核心数据属性,当属性更改时调用的方法调用另一个方法(IBAction)但在此IBAction中它添加了触发KVO方法的Core Data对象,触发了IBAction等等。这就是为什么我试图弄清楚调用方法的原因所以我可以阻止这个无限循环。
答案 0 :(得分:16)
你不能不遗余力地复制调试器,dtrace和/或其他各种完成此类工作的工具的功能。它非常依赖于建筑,并且充斥着特殊情况和不完整的情况。
你当然不希望在生产代码中做这样的事情。对于调试,有足够的工具可以在足够的上下文中执行此操作,而无需执行此操作。
你想做什么?
基本上我正在使用KVO和KVO 方法是从另一个触发的 我没有IBAction的方法 它通常会做什么 否则它会进入一个循环 (与我之前的问题有关)。
走这条路是疯狂的。它完全破坏了封装,使得一个方法的执行受到调用者的影响而不是某种显式参数或隐式配置,表明行为应该改变。
如果您最终陷入无限循环,那么我建议您重新审视整体架构。
特别是,当KVO通知触发时,几乎永远不会直接或间接触发同一财产的KVO通知。在非常罕见的情况下,这是不可避免的,你应该确保你有条不紊地使用-willChangeValueForKey:
和-didChangeValueForKey:
进行KVO触发。
基本上,只是为了解释,我是 观察核心数据属性和 当被调用时被调用的方法 属性更改调用另一种方法 (IBAction)但在此IBAction中 添加触发的Core Data对象 KVO方法触发了 IBAction等等。这就是我的原因 我试图弄清楚在哪里 方法被调用,所以我可以停止 这个无限循环
换句话说,你有一个模型层更改,然后在视图层和控制层之间的接口(IBAction方法)上调用一个方法,然后,毫不奇怪,它会触发另一个模型级别更改然后离开轨道....
一旦您的观察者触发并且您需要在模型中进行更改,您应该将所有更改逻辑保留在模型层中。毕竟,这是你的模型,应该有聪明才能适当地应用变化。
不应该发生的是控制层或视图层触发模型的更改以响应模型更改。只有在响应用户操作或某些外部事件(计时器,偶然)时才会发生对控制/视图层模型(对数据)的更改。