0

有时我必须在我的 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自述文件中的文件。

4

1 回答 1

0

好吧,简短的回答是不要使用NSRunAlertPanel。一段时间以来,该系列功能已不受欢迎,并被NSAlert. 改为使用NSAlert

(不幸的是,等的类参考NSRunAlertPanel没有提到这一点;我试图记住它最初是在哪里记录的;也许是发行说明)

于 2013-07-24T14:45:46.963 回答