为了显示某些情况下的错误,我在Mac OS X上使用了NSRunAlertPanel(在从Windows移植的代码中,我使用的是MessageBox)。
在实际创建Windows之前,正在运行一些代码并调用此代码以显示某些条件错误。
在线程com.apple.libdispatch-manager中,在以下调用堆栈下
0 _dispatch_mgr_invoke
1 _dispatch_mgr_thread
它正在给EXC_BAD_INSTRUCTION
是否因为在NSRunAlertPanel之前未创建Windows?
此运行时错误的原因是什么?在Mac OS X上,MessageBox的确切替代品是什么?
Long ShowDebugMessageBox (const wchar_t * Message, const wchar_t * Title)
{
NSString * message; ///< Message.
NSString * title; ///< Title.
NSInteger response; ///< response.
message = WideToNSString (Message);
title = WideToNSString (Title);
//response = NSRunAlertPanel(title, message, @"Yes", @"No", @"Cancel");
response = NSRunCriticalAlertPanel (title, message, @"Okay", @"Cancel", nil);
switch(response) {
case NSAlertDefaultReturn:
return IDYES;
case NSAlertAlternateReturn:
return IDNO;
default:
return IDCANCEL;
}
}
NSString * WideToNSString (const wchar_t * Str)
{
if(!Str) {
return nil;
}
NSString * str; ///< String in NSString.
#if CP_SIZEOFWCHAR == 4
str = [[NSString alloc] initWithBytes: (CVPtr) Str
length: sizeof(wchar_t)* wcslen(Str)
encoding: NSUTF32LittleEndianStringEncoding];
//encoding: NSUTF32StringEncoding];
#else
str = [[NSString alloc] initWithBytes: (CVPtr) Str
length: sizeof(wchar_t)* wcslen(Str);
encoding: NSUTF16LittleEndianStringEncoding];
//encoding: NSUTF16StringEncoding];
#endif
return str;
}
class File {
public:
int Open(char * fname, int mode)
{
fd = open(fname, mode);
}
int Close()
{
close(fd);
//fd = 0; //CAUSE of the PROBLEM
}
~File ()
{
//ALERT Display message box about the error.
ALERT(fd != 0);
}
private:
int fd;
};
这是显示消息框的代码。
从wchar_t * string(宽字符串)获取NSString的代码非常好,并且已经过测试。它在许多地方都可以使用并且运行良好。
其他应用程序(首先创建Window)上的相同代码运行良好。
调用File的析构函数时会发生问题。由于fd不为0,因此显示消息框并引起问题。
当fd设置为0时,不会为构造函数显示警告框。但是,显示了其他警报,但未发生任何问题。
是到期吗?
最佳答案
您没有提供足够的信息来说明导致异常的原因(请显示代码)。
我使用NSRunCriticalAlertPanel()
在我的应用程序中显示致命错误,几乎可以随时调用该错误:
void criticalAlertPanel(NSString *title, NSString *fmt, ...)
{
va_list va;
va_start(va, fmt);
NSString *message = [[NSString alloc] initWithFormat:fmt arguments:va];
va_end(va);
NSRunCriticalAlertPanel(title, message, @"OK", nil, nil);
}
(此代码已启用ARC)。
关于objective-c - 使用NSRunAlertPanel时EXC_BAD_INSTRUCTION,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16413809/