问题标签 [key-value-observing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
16363 浏览

objective-c - 我应该什么时候移除观察者?在移除观察者之前释放对象的错误

我正在尝试在我的一门课程中使用键值观察。我在 init 方法中注册了观察者并在 dealloc 中删除/取消注册它们,但是根据我的调试打印,我得到了以下错误,这似乎发生在我的 dealloc 方法被调用之前。

TekkPoint 类的实例 0x583870 正在被释放,而键值观察者仍向其注册。观察信息被泄露,甚至可能被错误地附加到其他对象上。在 NSKVODeallocateBreak 上设置断点以在调试器中停止。这是当前的观察信息:(上下文:0x0,属性:0x536400> 上下文:0x0,属性:0x55aba0>)

有没有一种特殊的方式我应该删除观察者?或者也许是我应该删除它们的特定位置?

根据这个问题,我做对了,但为什么会收到此错误消息?

这是我的dealloc例程:

需要注意的一点是,我的实现可能很奇怪,我正在从被观察者中添加和删除观察者,这会导致我的问题吗?

0 投票
1 回答
899 浏览

iphone - iPhone 上的 KVO 3.0 vs 2.2.1,有问题

似乎 3.0 NDA 已被取消,所以这个问题应该是安全的。如果这违反了 NDA,请让我知道,以便我可以删除帖子,匆忙后。

我在 NSOperationQueue 上有一个非常简单的 KVO 实现。我的问题是,在针对 2.2.1 SDK 进行编译时,对于使用 3.0 的设备或使用 2.2.1 的设备,我得到了不同的 NSOperationQueue 结果。我已经在 1 个 2.2.1 的 iPod Touch、一个 3.0 的 iPod Touch 和两组具有类似设置的 iPhone 上确认了这一点。

代码如下所示:

根据上面的代码,运行 3.0 的设备将返回正确的 operationCount 和正确的操作。运行 2.2.1 的设备对于操作将始终返回 nil,对于 operationCount 将始终返回 0。

似乎无法确定为什么会这样。所有构建都是针对 2.2.1 编译的。

笔记

根据下面马特的回应;'object' 在 2.2.1 上为零。在 3.0 上它不是零。

0 投票
1 回答
387 浏览

objective-c - 可可触摸问题。在触摸序列上下文中使用 KVO

我想在以下情况下使用 KVO:

1) 在 touchesBegan:withEvent: 我分配/初始化一个对象的实例,然后我通过 KVO 观察

我的目的是观察对象在其整个生命周期中的各种行为。

2) 在 touchesEnded:withEvent: 中,我将此实例分配给 NSMutableArray 并释放实例引用,因为 NSMutableArray 现在保留它。我还必须通过 removeObserver:forKeyPath 删除实例的 oberver:

这是有问题的,因为我现在已经失去了所有观察,除非我再次将观察添加回闻起来很糟糕的数组元素。

有没有办法让观察者保持依附于对象而不管谁拥有它?

谢谢,道格

0 投票
3 回答
843 浏览

objective-c - 如何观察对象实例的创建/销毁?

我被 KVC/KVO 迷住了。超级强大。不过有一个问题。我试图成为真正的 MVC 精神,但我认为没有办法使用观察模式来监视 Objective-C 类实例的分配或解除分配。

这实际上很重要,因为我有一个模型,其中包含我想从控制器(或委托)观察到的细粒度内部消息。对我来说,绊脚石是我不知道如何在模型外部为即将被释放的子组件移除观察者,而控制器不知道模型的内部逻辑会危及封装。

有人可以为这种情况提出一种方法。

谢谢,道格

0 投票
3 回答
2569 浏览

cocoa - 使用 NSMutableDictionary 与 NSMutableArray 造成的性能损失>

我正在考虑使用 NSMutableDictionary 代替我当前的 NSMutableArray。这主要是出于 KVC/KVO 的原因。该集合将在我的绘图方法的内部循环中发生重大变化。如果我继续进行此替换,我是否会受到重大的性能影响?

干杯,道格

0 投票
1 回答
1913 浏览

iphone - 可可触摸编程。内循环中的 KVO/KVC 超级慢。我如何加快速度?

我已经成为 KVO/KVC 的忠实粉丝。我喜欢它让我的 MVC 架构保持整洁的方式。但是,当我在我正在设计的 3D 渲染应用程序的内部渲染循环中使用 KVO 时,我不喜欢我所招致的巨大性能损失,其中消息将以每秒 60 次的速度为每个观察对象触发 - 可能是数百次。

加速 KVO 的技巧和窍门是什么?具体来说,我正在观察一个标量值 - 而不是一个对象 - 所以包装/展开可能会杀死我。我也在设置和拆除观察

在内循环内。也许我正在为此受到打击。

我真的,真的,想要保持 KVO 为我提供的巨大灵活性。有哪位速度狂人可以伸出援手吗?

干杯,道格

0 投票
1 回答
1163 浏览

objective-c - 如何告诉(托管)对象通知其 KVO 其属性之一需要重新缓存?

当我们有一个对象具有基于其他属性生成的属性时,通常我们实现+keyPathsForValuesAffecting{PropertyName}类方法。

对于我的 NSManagedObject 上的属性,我要做的基本上是相同的事情,但要遍历关系。

我的模型很简单;我有两个实体,应用程序和版本(我正在创建一个生成 appcast 的应用程序)。当 App 的属性发生变化时,因为我实现了上面的方法,所以 -appcast 字符串发生了变化,并且所有的绑定都被适当地更新了。

但是,当任何特定应用程序版本(对多关系)的任何属性发生更改时,-appcast 属性不会正确生成。我可以修复/解决方法吗?

0 投票
2 回答
33830 浏览

objective-c - NSDictionary 设置值:

好吧,这快把我逼疯了——请告诉我我没有疯掉!

我声明:

我是我的.h

我初始化:

在视图中会出现

我设置:

在一个方法中:

我得到“NSMutableDictionary 可能无法响应 setValue:forkey:”,并且应用程序在运行时崩溃。

请帮忙 :(

0 投票
1 回答
4626 浏览

objective-c - 在 NSPredicates 中使用关键路径

我有一个包含(我的自定义)GTPerson 对象的 NSDictionary。GTPerson 有一个NSMutableSet *parents属性,我在其上使用@propertyand @synthesize

在我的 NSDictionary 中,我想过滤所有没有任何父母的 GTPerson 对象,即父母的数量为 0。

我正在使用以下代码:

当我执行此操作时,我收到以下错误:

[<GTPerson 0x18e300> valueForUndefinedKey:]: this class is not key value coding-compliant for the key count.

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<GTPerson 0x18e300> valueForUndefinedKey:]: this class is not key value coding-compliant for the key count.'

为什么它试图调用countGTPerson 而不是它的parents属性?

0 投票
3 回答
3711 浏览

cocoa - 在 Cocoa 中观察自我

在 Cocoa 中,addObserver:forKeyPath:options:context:保留“既不是接收者,也不是观察者”。因此,我假设允许观察自我;也就是说,做类似的事情是完全有效的

[self addObserver:self forKeyPath...]

只要你记得self在 dealloc 中首先取消注册为观察者。

这个假设正确吗?