2

有人可以解释我在尝试使用基于视图的 NSOutlineView 时遇到的这种崩溃吗?崩溃仅发生在 OS X Lion (10.7) 上,而不是 Mountain Lion (10.8)。如果我在 ML 上运行应用程序,一切正常。但是,如果我在 Lion 上运行它,它会因下面的“无法解码类对象 (NSSourceListBackgroundView)”错误而崩溃。即使我将构建目标(不仅仅是部署目标)设置为 10.7 SDK(它针对 10.7 和 10.8 SDK 构建而没有警告或错误,并且在针对任何一个构建时在 10.8 上运行良好)也会发生这种情况。

我是否在不知不觉中使用了一些没有被编译器标记的仅限 10.8 的功能?如果重要的话,我已经自定义了大纲视图使用的 NSTableCellView 和 NSTableRowView 对象的背景,并且我的应用程序使用了自动布局。我在 Apple 更改日志、头文件或 NSOutlineView/NSTableView 文档中找不到任何关于此的内容,我的印象是基于视图的 NSOutlineViews 与 10.7 兼容。我以前广泛使用过 NSTableView,从来没有遇到过这样的问题,尽管这是我第一次尝试做 NSOutlineView。

我在谷歌和其他很多地方搜索了这个,我所能找到的只是一些讨论,在一个似乎没有解决方案的德语网站上看起来像一个相同的问题(从我能用谷歌翻译告诉)。

*** -[NSKeyedUnarchiver decodeObjectForKey:]: cannot decode object of class (NSSourceListBackgroundView)
    0   CoreFoundation                      0x00007fff944fcf56 __exceptionPreprocess + 198
1   libobjc.A.dylib                     0x00007fff95110d5e objc_exception_throw + 43
2   CoreFoundation                      0x00007fff944fcd8a +[NSException raise:format:arguments:] + 106
3   CoreFoundation                      0x00007fff944fcd14 +[NSException raise:format:] + 116
4   Foundation                          0x00007fff96f29705 _decodeObjectBinary + 2714
5   Foundation                          0x00007fff96f2a976 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1193
6   Foundation                          0x00007fff96f0145c -[NSArray(NSArray) initWithCoder:] + 486
7   Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
8   Foundation                          0x00007fff96f28ab2 _decodeObject + 201
9   AppKit                              0x00007fff91e08832 -[NSView initWithCoder:] + 1051
10  AppKit                              0x00007fff91e2667f -[NSScrollView initWithCoder:] + 240
11  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
12  Foundation                          0x00007fff96f2a976 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1193
13  Foundation                          0x00007fff96f0145c -[NSArray(NSArray) initWithCoder:] + 486
14  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
15  Foundation                          0x00007fff96f28ab2 _decodeObject + 201
16  AppKit                              0x00007fff91e08832 -[NSView initWithCoder:] + 1051
17  AppKit                              0x00007fff91e083a1 -[NSCustomView initWithCoder:] + 652
18  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
19  Foundation                          0x00007fff96f2a976 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1193
20  Foundation                          0x00007fff96f0145c -[NSArray(NSArray) initWithCoder:] + 486
21  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
22  Foundation                          0x00007fff96f28ab2 _decodeObject + 201
23  AppKit                              0x00007fff91e08832 -[NSView initWithCoder:] + 1051
24  AppKit                              0x00007fff91e083a1 -[NSCustomView initWithCoder:] + 652
25  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
26  Foundation                          0x00007fff96f2a976 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1193
27  Foundation                          0x00007fff96f0145c -[NSArray(NSArray) initWithCoder:] + 486
28  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
29  Foundation                          0x00007fff96f28ab2 _decodeObject + 201
30  AppKit                              0x00007fff91e08832 -[NSView initWithCoder:] + 1051
31  AppKit                              0x00007fff91e083a1 -[NSCustomView initWithCoder:] + 652
32  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
33  Foundation                          0x00007fff96f2a976 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1193
34  Foundation                          0x00007fff96f0145c -[NSArray(NSArray) initWithCoder:] + 486
35  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
36  Foundation                          0x00007fff96f28ab2 _decodeObject + 201
37  AppKit                              0x00007fff91e08832 -[NSView initWithCoder:] + 1051
38  AppKit                              0x00007fff91e083a1 -[NSCustomView initWithCoder:] + 652
39  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
40  Foundation                          0x00007fff96f2a976 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1193
41  Foundation                          0x00007fff96f0145c -[NSArray(NSArray) initWithCoder:] + 486
42  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
43  Foundation                          0x00007fff96f28ab2 _decodeObject + 201
44  AppKit                              0x00007fff91e08832 -[NSView initWithCoder:] + 1051
45  AppKit                              0x00007fff91e279cf -[NSClipView initWithCoder:] + 56
46  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
47  Foundation                          0x00007fff96f2a976 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1193
48  Foundation                          0x00007fff96f0145c -[NSArray(NSArray) initWithCoder:] + 486
49  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
50  Foundation                          0x00007fff96f28ab2 _decodeObject + 201
51  AppKit                              0x00007fff91e08832 -[NSView initWithCoder:] + 1051
52  AppKit                              0x00007fff91e2667f -[NSScrollView initWithCoder:] + 240
53  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
54  Foundation                          0x00007fff96f2a976 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1193
55  Foundation                          0x00007fff96f0145c -[NSArray(NSArray) initWithCoder:] + 486
56  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
57  Foundation                          0x00007fff96f28ab2 _decodeObject + 201
58  AppKit                              0x00007fff91e08832 -[NSView initWithCoder:] + 1051
59  AppKit                              0x00007fff91e083a1 -[NSCustomView initWithCoder:] + 652
60  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
61  Foundation                          0x00007fff96f2a976 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1193
62  Foundation                          0x00007fff96f0145c -[NSArray(NSArray) initWithCoder:] + 486
63  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
64  Foundation                          0x00007fff96f28ab2 _decodeObject + 201
65  AppKit                              0x00007fff91e08832 -[NSView initWithCoder:] + 1051
66  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
67  Foundation                          0x00007fff96f28ab2 _decodeObject + 201
68  AppKit                              0x00007fff91ef993e -[NSWindowTemplate initWithCoder:] + 3998
69  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
70  Foundation                          0x00007fff96f2a976 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] + 1193
71  Foundation                          0x00007fff96f2a377 -[NSSet(NSSet) initWithCoder:] + 519
72  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
73  Foundation                          0x00007fff96f28ab2 _decodeObject + 201
74  AppKit                              0x00007fff91d0d1b9 -[NSIBObjectData initWithCoder:] + 2099
75  Foundation                          0x00007fff96f29797 _decodeObjectBinary + 2860
76  Foundation                          0x00007fff96f28ab2 _decodeObject + 201
77  AppKit                              0x00007fff91d0c864 loadNib + 235
78  AppKit                              0x00007fff91d0bdb8 +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 217
79  AppKit                              0x00007fff91d0bcd3 +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 141
80  AppKit                              0x00007fff91d0bc16 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 364
81  AppKit                              0x00007fff91f7ccd7 NSApplicationMain + 398

附加信息:由于 NSSourceListBackgroundView 显然不是公共 API 的一部分,我开始四处寻找它被实例化的位置。通过查看我的 .xib 文件中的 XML,我能够确定它们显然是 NSScrollView 的子视图,其中包含有问题的 NSOutlineView(所以 IB 显然将它们放在那里?)。我插入了一条日志语句来转储 NSScrollView 的子视图,那里有一堆 NSSourceListBackgroundView 对象。

正如预期的那样,有两个 NSScroller 对象和一个 NSClipView。但是也有一堆这些 NSSourceListBackgroundView 对象显然无法在 Lion 上实例化(并且没有我可以看到的相应公共头文件)。我的其他基于视图的 NSTableView 对象都没有这个,除了 NSOutlineView。

另外,我没有将突出显示样式设置为“源列表”:它设置为“无”。

有谁知道这些对象的目的是什么,或者为什么 IB 将它们添加到我的 XIB 文件中?我的 XIB 是否已损坏?我真的宁愿不必重建它,所以我希望不会。

4

1 回答 1

1

我最终通过简单地从我的 xib 文件中删除整个 NSOutlineView 及其包含的 NSScrollView 并从头开始以完全相同的方式重建它们来解决此问题。当我这样做时,神秘的 NSSourceListBackgroundView 对象不再存在于 xib 中,并且 Lion 上的崩溃停止发生。没有它们,它在 Lion 和 Mountain Lion 上似乎仍然可以正常工作。

我从来没有找到一个很好的解释来解释为什么他们一开始就在那里(如果有人能重现它,我会很感兴趣),但我的猜测是这是由 Xcode/IB 错误引起的。我过去注意到,由 IB 创建的文件可能有点“脆弱”,并且不能容忍大量摆弄他们的选项(这有点烦人,因为让更改选项变得容易是拥有的全部意义) IB 而不是只在代码中做所有事情)。所以可能我在 UI 的那部分更改了一些选项,因为 IB 没有清理它,所以这些对象在 xib 中留下了“垃圾”。重建时直接进入最终设计避免了这个问题。

于 2013-08-13T18:25:05.420 回答