可能导致什么 - [NSPasteboard类型]崩溃?

时间:2011-01-29 11:29:32

标签: cocoa appkit nspasteboard

我们的一位客户有时会在粘贴时看到这样的崩溃:

0 com.apple.Foundation 0x9143bd1d readPointerAt + 9
1 com.apple.Foundation 0x9153221f empty + 43
2 com.apple.Foundation 0x9145d41f dealloc + 21
3 com.apple.Foundation 0x9145d3ce -[NSConcreteMapTable dealloc] + 35
4 com.apple.AppKit 0x9092aa5d -[_NSPasteboardOwnersCollection dealloc] + 45
5 com.apple.AppKit 0x905cdb8f _NSPasteboardReportChangedOwner + 66
6 com.apple.AppKit 0x905cd4aa -[NSPasteboard _updateTypeCacheIfNeeded] + 51
7 com.apple.AppKit 0x905cd361 -[NSPasteboard _typesAtIndex:usesPboardTypes:] + 52
8 com.apple.AppKit 0x905cd327 -[NSPasteboard types] + 50

有谁知道可能导致这种情况的原因?

  • 据我所知,粘贴板对象有效但内部崩溃。
  • 我认为这通常是在从其他应用程序粘贴时,是否可能其他应用程序错误管理其对粘贴板的所有权?

来自Does NSPasteboard retain owner objects?的更多信息表明是的,粘贴板保留了传递给它的所有者。因此,此崩溃必须是:

  • 我的代码中的过度释放。这会导致对象被释放,而粘贴板仍然保留对它的引用。我认为这不太可能,因为您希望问题出现在独立于粘贴板的位置,而且我没有看到一次崩溃(报告)提示。
  • NSPasteboard管理跨应用程序粘贴的方式出错并崩溃。任何人遇到类似的事情或知道可能导致什么?

2 个答案:

答案 0 :(得分:0)

这似乎是在处理有关前一个所有者的信息时(在当前所有者之前,由用户的最新副本设置)。也许就是你呢?检查您的复制代码。

如果你还没有在Zombies乐器下运行你的应用程序。

答案 1 :(得分:-1)

如果接受拖动粘贴的删除并在另一个线程中异步执行实际工作,则应保留粘贴板本身,否则,当主线程中的函数返回时,它可能会被释放。

它可能发生在拖动源端。

例如:

- (BOOL) outlineView:(NSOutlineView*)inOutlineView acceptDrop:(id<NSDraggingInfo>)inInfo item:(id)inItem childIndex:(NSInteger)inIndex
{
    NSPasteboard* pboard = [[inInfo draggingPasteboard] retain]; // This is necessary!

    BOOL result = YES;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^() 
    {
        // Do the real work hear:

        NSLog(@"types = %@", [pboard types]);

        [pboard release];
    });

    return result;

}