【问题标题】:Any way to see who is triggering changes re: key value observing?有什么方法可以查看谁在触发更改:关键值观察?
【发布时间】:2013-03-26 21:48:26
【问题描述】:

每当某些属性发生更改时,我都会使用键值观察来执行特定操作(例如,每当其框架或边界发生更改时,重新布局自定义 UIView 的子视图)。有什么方法可以查看是谁(即什么功能)触发了这种变化?在我的observeValueForKeyPath:ofObject:change:context: 中设置一个断点并没有帮助,因为我认为我看不到是谁导致对framebounds 的更改导致KVO 被触发。

在我的具体示例中,我无法弄清楚是谁/什么在改变我的 UIView 的尺寸。

编辑 #1:我的堆栈跟踪的屏幕截图,在 observeValue... 中调用帧/边界时暂停

另请注意,这仅用于调试目的。

【问题讨论】:

  • 你确定吗?尝试将堆栈跟踪窗口底部的滑块一直拖动到右侧,您应该能够看到修改您正在观察的属性的函数
  • 我添加了我的堆栈跟踪窗口的屏幕截图,所以请告诉我你看到了什么。我总是很难读到这些。
  • 感谢@MartinR。知道autoresizeArchivedView 是什么以及为什么要调用它吗?这不是我写的函数。我关闭了autoLayout,如果这是相关的(?)。
  • 每个视图都有自动调整大小的选项(即使没有自动布局)。我假设这些是在从 nib 文件加载视图时应用的。
  • 任何想法为什么它昨天可能有效但今天无效?例如,是否有一个我可能不小心未选中的复选框?每当我向 SO 发帖时,似乎总是这是问题所在,而不是我在代码中编写的任何内容。

标签: objective-c cocoa-touch debugging key-value key-value-observing


【解决方案1】:

一般来说,不,除了查看堆栈跟踪之外,您不知道是什么导致了特定的 KVC 突变(以及因此 KVO 通知)。在这种情况下,-[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize] 似乎是罪魁祸首,但更一般地说,它似乎是取消归档和布局触发通知的视图的过程。由于此更改并非来自您的代码,因此我不确定知道它来自哪里会有什么帮助。

您可以使用一些技巧将“知识”从堆栈较高的代码传递到堆栈较低的观察方法。您可以在[[NSThread currentThread] threadDictionary] 中存储一个标志/值,然后在您的观察者方法中检查它(记住在更高的堆栈帧返回之前显式删除标志。)也就是说,这样做有点恶心,而且最重要的是也就是说,它不会为您提供有关此类情况的任何信息,即您的代码不是直接触发更改的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多