gpt4 book ai didi

xcode - Cocoa 绑定(bind) + 过滤谓词 + 自动重新排列内容 = 崩溃

转载 作者:行者123 更新时间:2023-12-03 17:14:05 24 4
gpt4 key购买 nike

我遇到一个问题,一些简单的 Cocoa 绑定(bind)正在更改附加到设置了自动重新排列内容的 ArrayController 的获取谓词。

我的数据模型具有三个类(我们将它们称为 A、B 和 C)。它按照严格的层次结构排列,其中 class_A 的一个实例拥有一个或多个 class_B 实例,每个 class_B 实例又拥有一个或多个 class_C 实例;类 B 和 C 的每个实例都有对其父类的弱引用。例如:

@interface Class_A
@property (strong) NSArray *collection_of_b;
@property BOOL foo;
@end

@interface Class_B
@property (weak) Class_A class_A;
@property (strong) NSArray *collection_of_c;
@property (weak) SomeOtherClass bar;
@end

@interface Class_C
@property (weak) Class_B class_B;
@property (weak) SomeOtherClass baz;
@end

我在大型主从 View 中显示此层次结构。第一个 TableView 包含所有 class_A 实例的列表;选择后,第二个 TableView 将显示 class_B 实例的列表;再次选择后,第三个 TableView 将显示 class_C 实例的列表。

在每个列表下面,有一组字段绑定(bind)到所选的 class_A、class_B 或 class_C 实例(如 foo、bar 和 baz)的各种属性。这些字段要么使用严格符合 KVO 的访问器来修改类成员,要么我只是将字段直接绑定(bind)到选择成员。 (例如,class_A.foo 绑定(bind)到一组"is"和“否”的单选按钮。)所有这些似乎都运行良好。

现在,重点来了。在同一窗口的另一部分中,我呈现了具有某些属性的 class_C 实例的筛选列表。为了呈现该过滤列表,我使用过滤谓词指定一些条件,例如“(class_B.bar == some value) OR (class_B.class_A.foo == YES)”。过滤工作完美......直到我通过绑定(bind)字段更改 foo 或 bar 的值,此时我的应用程序立即崩溃并显示以下消息:

“无法从 中删除键路径“bar”的观察者,很可能是因为键“bar”的值已更改,而没有发送适当的 KVO 通知。请检查 Class_B 的 KVO 合规性类。”

我已将问题范围缩小到 ArrayController 的“自动重新排列内容”设置。当我关闭此功能时,当实例的过滤属性发生更改时,表不会自动调整内容,但它也不会崩溃。当然,我可以手动触发重新排列,但这是一个不太优雅的解决方案。

一些搜索发现 2009 年的 cocoa-dev 线程报告了与自动排列内容完全相同的行为作为错误:

https://groups.google.com/forum/?hl=en&fromgroups#!topic/cocoa-dev/SpXF0__B4dE

但不确定可以采取什么措施。有什么想法吗?

最佳答案

我猜您的问题根源在这里:

@property (weak) SomeOtherClass bar;

@property (weak) Class_B class_B;

当这些对象被释放时,它们的实例变量被运行时设置为 nil,但不会发出 KVO 通知。

尝试将这些属性更改为strong 属性,看看是否可以解决问题。

有一些good, but complex explanation about this situation in this blog post .

关于xcode - Cocoa 绑定(bind) + 过滤谓词 + 自动重新排列内容 = 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12024556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com