有没有办法告诉是什么原因导致-drawRect:消息被发送到NSView?

时间:2017-03-08 19:00:59

标签: cocoa nsview drawrect appkit

我的应用中存在不一致的行为,即使在按照接收到的相同步骤后,MyView有时也无法接收到绘制通话。

问题是,在drawRect的回溯中,没有框架告诉我代码中发生了什么导致消息被发送

这是一个示例回溯(前两帧不重要):

2   MyApp                               0x00000001000112a5 -[MyView drawRect:] + 1429
3   AppKit                              0x00007fff8bfc87be -[NSView(NSInternal) _recursive:displayRectIgnoringOpacity:inGraphicsContext:CGContext:topView:shouldChangeFontReferenceColor:] + 1331
4   AppKit                              0x00007fff8bfc8156 __46-[NSView(NSLayerKitGlue) drawLayer:inContext:]_block_invoke + 242
5   AppKit                              0x00007fff8bfc7caf -[NSView(NSLayerKitGlue) _drawViewBackingLayer:inContext:drawingHandler:] + 2403
6   AppKit                              0x00007fff8bfc7341 -[NSView(NSLayerKitGlue) drawLayer:inContext:] + 108
7   QuartzCore                          0x00007fff88045b19 CABackingStoreUpdate_ + 3494
8   QuartzCore                          0x00007fff88044d6d ___ZN2CA5Layer8display_Ev_block_invoke + 59
9   QuartzCore                          0x00007fff88044759 _ZN2CA5Layer8display_Ev + 1565
10  AppKit                              0x00007fff8bfc6318 _NSBackingLayerDisplay + 641
11  AppKit                              0x00007fff8bfb8878 -[_NSViewBackingLayer display] + 818
12  QuartzCore                          0x00007fff880364a5 _ZN2CA5Layer17display_if_neededEPNS_11TransactionE + 603
13  QuartzCore                          0x00007fff88035fcd _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 35
14  QuartzCore                          0x00007fff880354a1 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277
15  QuartzCore                          0x00007fff880350ec _ZN2CA11Transaction6commitEv + 508
16  QuartzCore                          0x00007fff88040977 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 71
17  CoreFoundation                      0x00007fff88f3efc7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
18  CoreFoundation                      0x00007fff88f3ef37 __CFRunLoopDoObservers + 391
19  CoreFoundation                      0x00007fff88f1de58 CFRunLoopRunSpecific + 328
20  HIToolbox                           0x00007fff93726935 RunCurrentEventLoopInMode + 235
21  HIToolbox                           0x00007fff9372676f ReceiveNextEventCommon + 432
22  HIToolbox                           0x00007fff937265af _BlockUntilNextEventMatchingListInModeWithFilter + 71
23  AppKit                              0x00007fff8be5fdf6 _DPSNextEvent + 1067
24  AppKit                              0x00007fff8be5f226 -[NSApplication _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 454
25  AppKit                              0x00007fff8be53d80 -[NSApplication run] + 682
26  AppKit                              0x00007fff8be1d368 NSApplicationMain + 1176
27  MyApp                               0x000000010000d102 main + 34
28  libdyld.dylib                       0x00007fff8ec5c5ad start + 1

我只是想弄清楚是否可以确切地看到-drawRect中发生的正是哪些消息/事件,所以我可以看到为什么-drawRect是偶尔没有收到

请注意,我已经看过这个帖子:How to tell what's causing drawRect to be called?,但它没有回答我的问题

1 个答案:

答案 0 :(得分:0)

好的,所以我知道我说前两帧并不重要,但事实证明他们没有。

只是一个大脑放屁,我已经将断点设置为3个深度叠加帧,如果我刚刚将它设置在drawRect中,我会发现它实际上是每次我预期它被调用的时候。第二个堆栈框架中有一个if语句阻止执行进入顶层堆栈框架,我在写这个问题时正在打破这个问题T.T