更新:在Sierra 10.12.6上没有发生崩溃。但它确实每次都出现在我的High Sierra 10.13.4机器上。所以似乎在High Sierra中引入了AppKit问题。记录了Apple的错误。
我创建了一个最小的例子here。
我的NSWindowController
从.xib文件加载NSWindow
。该窗口仅包含NSScrollView
。在awakeFromNib
中,我将滚动视图文档设置为我的NSOpenGLView
子类的实例:
- (void)awakeFromNib
{
sessionView = [[SessionView alloc] initWithFrame:NSMakeRect(0, 0, 1024, 768) pixelFormat:[NSOpenGLView defaultPixelFormat]];
[self.sessionScrollView setDocumentView:sessionView];
}
NSOpenGLView
子类可以是完全空的实现,例如:
标题
#import <Cocoa/Cocoa.h>
#import <OpenGL/gl.h>
@interface SessionView : NSOpenGLView
{
}
@end
Imlementation
#import "SessionView.h"
@implementation SessionView
@end
现在抓住窗户的一角开始调整大小。将手指放在鼠标按钮上,拖动窗口边缘直至其崩溃。
***由于未捕获的异常终止应用程序&#39; NSInternalInconsistencyException&#39;,原因:&#39;不平衡的需求显示 在直接发布计数。&#39;
(我把完整的堆栈跟踪放在帖子的末尾,你会看到它是所有的框架代码)。
这些方法_enableNeedsDisplayInRectNotifications
和_enableNeedsDisplayInRectNotifications
正在发生一些事情。让我们覆盖它们:
static int count;
- (void)_enableNeedsDisplayInRectNotifications
{
count--;
NSLog(@"enable");
[super _enableNeedsDisplayInRectNotifications];
}
- (void)_disableNeedsDisplayInRectNotifications
{
count++;
NSLog(@"disable");
[super _disableNeedsDisplayInRectNotifications];
}
我们可以看到,在调整窗口大小时,会重复调用_enableNeedsDisplayInRectNotifications
。一旦我们放开鼠标并结束调整大小,每次调用_disableNeedsDisplayInRectNotifications
时都会调用_enable...
一次。
问题是,如果我们达到-63的计数;我们崩溃了。
我可以通过覆盖这些方法而不是调用super
来解决。
发生了什么事?
完成堆栈跟踪:
0 CoreFoundation 0x00007fff504d932b __exceptionPreprocess + 171 1 libobjc.A.dylib 0x00007fff77b53c76 objc_exception_throw + 48 2 CoreFoundation
0x00007fff504df0c2 + [NSException raise:format:arguments:] + 98 3
基金会0x00007fff525fb340 - [NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193 4
AppKit 0x00007fff4e2a9af2 - [NSView(NSInternal)_disableNeedsDisplayInRectNotifications] + 190 5 test2 0x000000010949ffb3 - [SessionView _disableNeedsDisplayInRectNotifications] + 83 6 AppKit 0x00007fff4e06876b - [_ NSPortalView2 setSourceView:] + 166 7 AppKit
0x00007fff4e06802a - [NSPortalView dealloc] + 89 8 libobjc.A.dylib
0x00007fff77b49087 _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 817 9 CoreFoundation 0x00007fff50412a56 _CFAutoreleasePoolPop + 22 10基础0x00007fff525378ad - [NSAutoreleasePool drain] + 144 11 AppKit
0x00007fff4d9e3990 - [NSApplication run] + 1031 12 AppKit
0x00007fff4d9b2a72 NSApplicationMain + 804 13 test2
0x000000010949ffe2 main + 34 14 libdyld.dylib
0x00007fff7876d015开始+ 1 15 ??? 0x0000000000000001 0x0 + 1Thread 0 Crashed :: Dispatch queue:com.apple.main-thread 0
libsystem_kernel.dylib 0x00007fff788bdb6e __pthread_kill + 10 1 libsystem_pthread.dylib 0x00007fff78a88080 pthread_kill + 333 2 libsystem_c.dylib 0x00007fff788191ae abort + 127 3 libc ++ abi.dylib 0x00007fff7671df8f abort_message + 245 4 libc ++ abi.dylib 0x00007fff7671e12b default_terminate_handler()+ 265 5 libobjc.A.dylib
0x00007fff77b55ea3 _objc_terminate()+ 97 6 libc ++ abi.dylib
0x00007fff767397c9 std :: __ terminate(void()())+ 8 7
libc ++ abi.dylib 0x00007fff7673926f __cxa_throw + 121 8 libobjc.A.dylib 0x00007fff77b53da5 objc_exception_throw + 351 9 com.apple.CoreFoundation 0x00007fff504df0c2 + [NSException raise:format:arguments:] + 98 10 com.apple.Foundation 0x00007fff525fb340 - [NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193 11 com.apple.AppKit 0x00007fff4e2a9af2 - [NSView(NSInternal) _disableNeedsDisplayInRectNotifications] + 190 12 dev.test2 0x000000010949ffb3 - [SessionView _disableNeedsDisplayInRectNotifications] + 83(SessionView.m:21)13 com.apple.AppKit 0x00007fff4e06876b - [_ NSPortalView2 setSourceView:] + 166 14 com.apple.AppKit
0x00007fff4e06802a - [NSPortalView dealloc] + 89 15 libobjc.A.dylib
0x00007fff77b49087(匿名 namespace):: AutoreleasePoolPage :: pop(void )+ 817 16 com.apple.CoreFoundation 0x00007fff50412a56 _CFAutoreleasePoolPop + 22 17 com.apple.Foundation 0x00007fff525378ad - [NSAutoreleasePool drain] + 144 18 com.apple.AppKit 0x00007fff4d9e3990 - [NSApplication run] + 1031 19 com.apple.AppKit 0x00007fff4d9b2a72 NSApplicationMain + 804 20 dev.test2
0x000000010949ffe2 main + 34(main.m:4)21 libdyld.dylib
0x00007fff7876d015 start + 1