小编Den*_*nis的帖子

调试断点是否导致"EXC_BREAKPOINT(SIGTRAP)"异常?

我有一个多线程的应用程序,在我的所有测试机器上都非常稳定,并且对于几乎每个用户来说似乎都很稳定(基于没有崩溃的抱怨).该应用程序经常为一个用户崩溃,他们很友好地发送崩溃报告.所有崩溃报告(~10个连续报告)看起来基本相同:

Date/Time:       2010-04-06 11:44:56.106 -0700
OS Version:      Mac OS X 10.6.3 (10D573)
Report Version:  6

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   com.apple.CoreFoundation        0x90ab98d4 __CFBasicHashRehash + 3348
1   com.apple.CoreFoundation        0x90adf610 CFBasicHashRemoveValue + 1264
2   com.apple.CoreText              0x94e0069c TCFMutableSet::Intersect(__CFSet const*) const + 126
3   com.apple.CoreText              0x94dfe465 TDescriptorSource::CopyMandatoryMatchableRequest(__CFDictionary const*, __CFSet const*) + 115
4   com.apple.CoreText              0x94dfdda6 TDescriptorSource::CopyDescriptorsForRequest(__CFDictionary const*, __CFSet const*, long (*)(void const*, void const*, void*), void*, unsigned long) …
Run Code Online (Sandbox Code Playgroud)

macos cocoa gdb breakpoints exception

79
推荐指数
2
解决办法
7万
查看次数

NSURLConnection在10.5.7下崩溃

我有一个小应用程序可以下载股票价格并且完美运行(多年),直到我最近升级到10.5.7.升级后,程序将在此调用时崩溃:

NSString *currinfo = [NSString stringWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://finance.yahoo.com/d/quotes.csv?s=%@&f=l1c1p2", escsymbol]]];
Run Code Online (Sandbox Code Playgroud)

奇怪的是,崩溃不会马上发生.这行代码被多次调用,没有任何问题,然后由于此调用崩溃,程序最终会在1-2小时后失败.

我原本在这里发了一篇很长的帖子,描述了我试图调查这个问题.我收到了两个建议:(i)使调用异步(可能更好)和(ii)使用NSZombieEnabled来调查Objective-C对象提前解除分配的可能性(此注释是为了响应显示失败的堆栈跟踪而做出的objc_msgSend).

我花了很多时间使调用异步(使用[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]),这没有帮助.该计划最终仍然失败,通常在10-15分钟后.在失败之前的这段时间内,许多异步调用没有任何问题,数据被返回等等.一切都很好.然后程序突然再次崩溃.

然后我打开了NSZombieEnabled.果然,当程序最终崩溃时,我收到了消息:

-[CFArray count]: message sent to deallocated instance 0x16b90bd0
Run Code Online (Sandbox Code Playgroud)

"info malloc 0x16b90bd0"随后产生:

0: 0x93db810c in malloc_zone_malloc
1: 0x946bc3d1 in _CFRuntimeCreateInstance
2: 0x9464a138 in __CFArrayInit
3: 0x946cd647 in _CFStreamScheduleWithRunLoop
4: 0x932d1267 in _Z16_scheduleRStreamPKvPv
5: 0x946bf15c in CFSetApplyFunction
6: 0x932b0e2b in CFNSchedulingSetScheduleReadStream
7: 0x9331a310 in _ZN12HTTPProtocol19createAndOpenStreamEv
8: 0x9332e877 in _ZN19URLConnectionLoader24loaderScheduleOriginLoadEPK13_CFURLRequest
9: 0x9332d739 in _ZN19URLConnectionLoader26LoaderConnectionEventQueue33processAllEventsAndConsumePayloadEP20XConnectionEventInfoI12XLoaderEvent18XLoaderEventParamsEl
10: 0x9332dbdd in _ZN19URLConnectionLoader13processEventsEv
11: 0x932d8dbf in _ZN17MultiplexerSource7performEv
12: 0x946ba595 in CFRunLoopRunSpecific
13: …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c

10
推荐指数
2
解决办法
3571
查看次数

NSMenuItem中的自定义NSView未接收鼠标事件

我使用popUpStatusItemMenu从NSStatusItem中弹出一个NSMenu.这些NSMenuItems显示了一堆不同的链接,每个链接都与setAction:连接到目标的openLink:方法.这种安排长期以来一直很好.用户从菜单中选择一个链接,然后openLink:方法处理它.

不幸的是,我最近决定尝试使用NSMenuItem的setView:方法来提供更好/更滑动的界面.基本上,我刚停止设置标题,创建了NSMenuItem,然后使用setView:来显示自定义视图.这非常有效,菜单项看起来很棒,我的自定义视图也会显示出来.

但是,当用户选择菜单项并释放鼠标时,操作将不再起作用(即,不会调用openLink:).如果我只是简单地注释掉setView:call,那么动作再次起作用(当然,菜单项是空白的,但动作正确执行).那么,我的第一个问题就是设置视图会破坏NSMenuItem的操作.

没问题,我想,我会通过在自定义视图中检测mouseUp事件并从那里调用我的action方法来修复它.我将此方法添加到自定义视图中:

- (void)mouseUp:(NSEvent *)theEvent {
  NSLog(@"in mouseUp");
  }
Run Code Online (Sandbox Code Playgroud)

没有骰子!永远不会调用此方法.

不过,我可以设置跟踪rects并接收mouseEntered:事件.我在mouseEntered例程中进行了一些测试,如下所示:

if ([[self window] ignoresMouseEvents]) {  NSLog(@"ignoring mouse events");  }
else {  NSLog(@"not ignoring mouse events");  }
if ([[self window] canBecomeKeyWindow]) {  dNSLog((@"canBecomeKeyWindow"));  }
else {  NSLog(@"not canBecomeKeyWindow");  }
if ([[self window] isKeyWindow]) {  dNSLog((@"isKeyWindow"));  }
else {  NSLog(@"not isKeyWindow");  }
Run Code Online (Sandbox Code Playgroud)

并得到以下回应:

not ignoring mouse events
canBecomeKeyWindow
not isKeyWindow
Run Code Online (Sandbox Code Playgroud)

这是问题吗?"not isKeyWindow"?据推测,这并不好,因为Apple的文档说"如果用户点击不在关键窗口中的视图,默认情况下窗口会被提前并变为密钥,但不会调度鼠标事件." 但必须有办法检测这些事件.怎么样?

添加:

[[self window] makeKeyWindow];
Run Code Online (Sandbox Code Playgroud)

尽管canBecomeKeyWindow是YES,但是没有效果.

cocoa nsstatusitem nsmenuitem

8
推荐指数
3
解决办法
4783
查看次数

为什么NSView的框架方法返回错误的结果?

我偶尔想要改变一个NSView的维度.为此,获取各种视图的尺寸,相对于彼此调整它们,然后使用setFrame:重新定位是有帮助的.

问题是,从我的角度来看,frame方法通常会返回明显错误的NSRects.

我有一个程序,在Interface Builder中设置了NSPanel,并与我的主程序有各种连接.为了测试框架返回的NSRects,我在应用程序的awakeFromNib:方法中打开了面板,检索了一些NSRects,并将它们打印到控制台.

这是我的awakeFromNib:

- (void)awakeFromNib {
  NSLog(@"in awakeFromNib");
  [self showPrefsSheet:self]; //this is the prefs sheet with the controls of interest
                              //note that it does indeed pop up and is displayed
  originalFrame = [aTextView frame];
  NSLog(@"the frame is %d, %d, %d, %d", originalFrame.origin.x, originalFrame.origin.y, originalFrame.size.width, originalFrame.size.height);
  originalFrame = [aButton frame];
  NSLog(@"the frame is %d, %d, %d, %d", originalFrame.origin.x, originalFrame.origin.y, originalFrame.size.width, originalFrame.size.height);
  return;
  }
Run Code Online (Sandbox Code Playgroud)

此代码的结果在控制台中如下所示:

in awakeFromNib
the frame is 0, 0, 0, 0
the frame is 0, 1079230464, 0, …
Run Code Online (Sandbox Code Playgroud)

formatting cocoa nslog nsview

3
推荐指数
1
解决办法
1582
查看次数