查找调用方法的位置

Jos*_*hua 2 cocoa objective-c

我如何找出调用方法的位置?就像你在堆栈跟踪中看到的那样.

基本上,只是为了解释,我正在观察一个核心数据属性和当属性更改时调用的方法调用另一个方法(IBAction),但在这个IBAction中它添加了核心数据对象,触发了触发IBAction的KVO方法等等向前.这就是为什么我试图找出调用方法的原因所以我可以阻止这个无限循环.

bbu*_*bum 16

你不能不遗余力地复制调试器,dtrace和/或其他各种完成此类工作的工具的功能.它具有显着的架构依赖性,并且充斥着特殊情况和不完整的情况.

你当然不希望在生产代码中做这样的事情.对于调试,有足够的工具可以在足够的上下文中执行此操作,而无需执行此操作.

你想做什么?

基本上我正在使用KVO,如果KVO方法是从另一个IBAction方法触发的,我不知道它通常做什么,否则它会进入一个循环(与我之前的问题相关).

沿着这条道路走下去就是疯狂.它完全打破了封装,使得一个方法的执行受到调用者的影响而不是某种显式参数或隐式配置,表明行为应该改变.

如果您最终处于无限循环中,那么我建议您重新审视整体架构.

特别是,当KVO通知触发时,它几乎不应直接或间接触发同一财产的KVO通知.在非常罕见的情况下,这是不可避免的,你应该确保你手动使用-willChangeValueForKey:-didChangeValueForKey:有条件地进行KVO触发.

基本上,只是为了解释,我正在观察一个核心数据属性和当属性更改时调用的方法调用另一个方法(IBAction),但在这个IBAction中它添加了核心数据对象,触发了触发IBAction的KVO方法等等向前.这就是为什么我试图找出调用方法的原因所以我可以阻止这个无限循环

换句话说,你有一个模型层更改,然后在视图层和控制层之间的接口(IBAction方法)调用一个方法,然后,毫不奇怪,触发另一个模型级别更改然后离开轨道...... .

一旦您的观察者触发并且您需要在模型中进行更改,您应该将所有更改逻辑保留在模型层中.毕竟,这是你的模型,应该有聪明才能适当地应用变更.

不应该发生的是控制层或视图层触发模型的更改以响应模型的变化.只有在响应用户操作或某些外部事件(计时器,偶然)时才会发生对控制/视图层模型(数据)的更改.

  • 沿着这条道路走下去就是疯狂,因为它完全打破了包围.你真的不想使用*caller*透明地修改*callee*行为的设计模式. (11认同)
  • "沿着那条路走下去就是疯狂"+10 (3认同)