有时我必须在我的 Cocoa 代码段中做一个弹出警报窗口。以前我是NSAlert
直接用然后runModal
得去的,后来我发现这样NSRunAlertPanel
更容易达到我的目的。所以我决定将我所有的警报功能切换到NSRunAlertPanel
. 大部分时间都还好。</p>
现在我正在添加多线程。我发现这NSRunAlertPanel
显然比NSAlert
在主线程中回调时要慢。
代码段:
首先我创建一个线程:
[NSThread detachNewThreadSelector: @selector(tryRunLoop:) toTarget:self withObject:nil];
然后这个tryRunLoop
线程中的这个函数调用主线程中的警报窗口函数:
while(1)
[self performSelectorOnMainThread:@selector(showAlert:) withObject:anObject waitUntilDone:YES];
主线程中的函数showAlert
完成其余的事情:
NSRunAlertPanel(@"Warning:",@"Just testing", @"YES", nil, nil);
随着时间的推移,弹出窗口的响应越来越慢。如果我使用NSAlert
而不是NSRunAlertPanel
,或者没有在主线程中运行弹出方法,症状应该会消失。
我还发现这两种方法的 CPU 使用率也不同。显然NSAlert
,在一直按下按钮的同时会降低 CPU 使用率。
有人能够解释这些现象吗?
PS:我是不允许把整个原始项目放到网上,所以我在 Github 中创建了一个简单的 Cocoa 项目来模拟症状和URL,请先看一下Known issues
自述文件中的文件。