1

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

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

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

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

来自 NSPasteboard 是否保留所有者对象的更多信息说是的,粘贴板保留了传递给它的所有者。因此,此崩溃必须是:

  • 我的代码中的过度发布。这会导致一个对象被释放,而粘贴板仍然持有对它的引用。我认为这不太可能,因为您希望问题会独立于粘贴板而出现,而且我还没有看到一个崩溃(报告)表明这一点。
  • NSPasteboard管理跨应用程序粘贴的方式出现问题并崩溃。有没有人遇到过这样的事情或者知道是什么原因造成的?
4

2 回答 2

0

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

如果您还没有,也可以在 Zombies 仪器下运行您的应用程序。

于 2011-01-29T13:19:08.360 回答
-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;

}

于 2014-03-06T22:08:31.867 回答