0%

macOS 低版本内误引用高版本API导致的 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ 闪退

NSSearchField 的 delegate 是 10.10 以上方法。如果将该方法使用,并运行到了 10.9 或以下机型内,会报如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 com.eusoft.eudic 0x000000010d093f3a 0x10cfa2000 + 991034
1 com.eusoft.eudic 0x000000010d0922c6 0x10cfa2000 + 983750
2 com.eusoft.eudic 0x000000010d09095e 0x10cfa2000 + 977246
3 com.eusoft.eudic 0x000000010d090c98 0x10cfa2000 + 978072
4 com.apple.CoreFoundation 0x00007fff965a4e0c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
5 com.apple.CoreFoundation 0x00007fff9649882d _CFXNotificationPost + 2893
6 com.apple.Foundation 0x00007fff922c4e4a -[NSNotificationCenter postNotificationName:object:userInfo:] + 68
7 com.eusoft.eudic 0x000000010d0d562d 0x10cfa2000 + 1259053
8 com.apple.CoreFoundation 0x00007fff965a4e0c __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
9 com.apple.CoreFoundation 0x00007fff9649882d _CFXNotificationPost + 2893
10 com.apple.Foundation 0x00007fff922c4e4a -[NSNotificationCenter postNotificationName:object:userInfo:] + 68
11 com.apple.AppKit 0x00007fff92726abf -[NSTableView _sendSelectionChangedNotificationForRows:columns:] + 177
12 com.apple.AppKit 0x00007fff92653354 -[NSTableView _enableSelectionPostingAndPost] + 406
13 com.apple.AppKit 0x00007fff92726427 -[NSTableView _doSelectIndexes:byExtendingSelection:indexType:funnelThroughSingleIndexVersion:] + 2706
14 com.eusoft.eudic 0x000000010d0d34b8 0x10cfa2000 + 1250488
15 com.eusoft.eudic 0x000000010d08f3d8 0x10cfa2000 + 971736
16 com.apple.AppKit 0x00007fff925d5b3f -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1223
17 com.apple.AppKit 0x00007fff92679e5c -[NSNib _instantiateNibWithExternalNameTable:] + 600
18 com.apple.AppKit 0x00007fff927a9482 -[NSNib instantiateNibWithOwner:topLevelObjects:] + 215
19 com.apple.AppKit 0x00007fff927a9262 -[NSViewController loadView] + 180
20 com.apple.AppKit 0x00007fff926d7718 -[NSViewController view] + 41
21 com.eusoft.eudic 0x000000010d11e1f0 0x10cfa2000 + 1556976
22 com.apple.AppKit 0x00007fff92d1c099 -[NSToolbarButton sendAction:to:] + 75
23 com.apple.AppKit 0x00007fff92d1c0e8 -[NSToolbarButton sendAction] + 65
24 com.apple.AppKit 0x00007fff928cff0c -[NSToolbarItemViewer mouseDown:] + 4897
25 com.apple.AppKit 0x00007fff927eba58 -[NSWindow sendEvent:] + 11296
26 com.apple.AppKit 0x00007fff9278a5d4 -[NSApplication sendEvent:] + 2021
27 com.apple.AppKit 0x00007fff925da9f9 -[NSApplication run] + 646
28 com.apple.AppKit 0x00007fff925c5783 NSApplicationMain + 940
29 libdyld.dylib 0x00007fff96a765fd start + 1

推测可能是 Cocoa 内部的 Protocol ,仍然大部分用的是 NSNotification 实现,导致出错的堆栈提示的是 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__