什么可能导致 - [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;
}
在您的示例中的保留是没有必要的;无论如何,该块会为你保留粘贴板。不,这不是我看到一些报道的问题。 –
只有在块内使用该块时,块才会保留粘贴板。您可以使用其中一个纸板项目,它只对纸板有一个较弱的参考。对我来说,它解决了频繁的崩溃问题。 –