【问题标题】:Finding where a method was called from查找从哪里调用方法
【发布时间】:2009-10-23 15:27:48
【问题描述】:

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

基本上,只是为了解释一下,我正在观察一个核心数据属性,并且当属性更改时调用的方法调用另一个方法(IBAction),但在这个 IBAction 中,它添加了触发 KVO 方法的核心数据对象,该方法触发了IBAction 等等。这就是为什么我试图弄清楚从哪里调用该方法,以便停止这个无限循环。

【问题讨论】:

  • StackTrace 类有帮助吗?
  • Cocoa 中没有 StackTrace 类。
  • 不——不是重复的。在那个问题中,OP 试图调试一些东西。在这种情况下,Joshua 试图使用调用方法来确定正在执行的方法中的上下文。非常非常不同。
  • @bbum touché。 (在这里添加额外的字符,以便我发表评论)

标签: objective-c cocoa


【解决方案1】:

您必须不遗余力地复制调试器、dtrace 和/或执行此类操作的各种其他工具的功能。它非常依赖于架构,并且充斥着完全不起作用的特殊情况和情况。

你肯定不会想在生产代码中做这样的事情。对于调试,有足够多的工具可以在足够多的上下文中执行此操作,而无需这样做。

你想做什么?

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

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

如果您最终陷入无限循环,那么我建议您重新审视您的整体架构。

特别是,当 KVO 通知触发时,它应该几乎从不直接或间接触发相同属性的 KVO 通知。在这种不可避免的极少数情况下,您应该确保有条件地使用 -willChangeValueForKey:-didChangeValueForKey: 手动执行 KVO 触发器。

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

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

一旦您的观察者触发并且您需要对模型进行更改,您应该将所有更改逻辑保留在模型层中。毕竟,它是您的模型,它应该具有适当应用更改的智能。

不应该发生的是控制层或视图层触发模型的变化以响应模型的变化。从控制/视图层对模型(对数据)的更改应该仅在响应用户操作或某些外部事件(可能是计时器)时发生。

【讨论】:

  • 基本上我使用的是 KVO,如果 KVO 方法是从另一个 IBAction 方法触发的,我不会做什么它通常会做的事情,否则它会进入一个循环(相关我之前的问题)。
  • 这条路是疯狂的,因为它完全破坏了封装。你真的不想使用 caller 透明地修改 callee 行为的设计模式。
  • 基本上,只是为了解释一下,我正在观察一个核心数据属性,并且当属性更改时调用的方法调用另一个方法(IBAction),但是在这个 IBAction 中它添加了触发触发 IBAction 等的 KVO 方法。这就是为什么我试图弄清楚从哪里调用该方法,以便停止这个无限循环。
  • “那条路就是疯狂”+10
  • 那么,如果你认为我想要做的是疯狂,你认为我应该怎么做?
猜你喜欢
  • 2015-08-19
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2014-06-17
  • 1970-01-01
相关资源
最近更新 更多