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

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

问题描述:

我们的一个客户在粘贴时,有时会看到像这样的碰撞:什么可能导致 - [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。任何人都遇到过这样的事情,或知道可能会导致什么?

这似乎

约以前的主人(由用户最近的副本设置当前所有者之前)信息配置的时候要。也许这就是你?检查你的复制代码。

如果你还没有运行僵尸工具下的应用程序,

如果您接受拖放粘贴的拖放并在另一个线程中异步执行实际工作,则应该保留自己的粘贴板,否则当主线程中的函数返回时可能会取消分配。

它可能发生在拖动源端。

例如:

- (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; 

}

+0

在您的示例中的保留是没有必要的;无论如何,该块会为你保留粘贴板。不,这不是我看到一些报道的问题。 –

+0

只有在块内使用该块时,块才会保留粘贴板。您可以使用其中一个纸板项目,它只对纸板有一个较弱的参考。对我来说,它解决了频繁的崩溃问题。 –