Что может привести к сбою [типов 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

У кого-нибудь есть идеи, что может вызвать это?

  • Насколько я могу судить, объект "монтажный картон" действителен, но затем завершается сбоем.
  • Я думаю, что, как правило, это происходит при вставке из другого приложения, возможно ли, что другое приложение неправильно управляет своим владельцем монтажной панели?

Дополнительная информация от NSPasteboard сохраняет объекты-владельцы? говорит, что да, картон сохраняет владельцев переданы ему. Следовательно, этот сбой должен быть либо:

  • Переиздание в моем коде. Это приводит к тому, что объект освобождается, в то время как монтажная доска все еще содержит ссылку на него. Я думаю, что это маловероятно, так как вы ожидаете, что проблема будет отображаться независимо от монтажной панели, и я не видел ни одного сбоя (отчета), чтобы это предположить.
  • Что-то на пути NSPasteboard управляет пастами между приложениями, работает неправильно и дает сбой. Кто-нибудь сталкивался с чем-то подобным или знает, что может быть причиной?

2 ответа

По-видимому, это происходит при удалении информации о предыдущем владельце (перед текущим владельцем, как установлено самой последней копией пользователя). Возможно это ты? Проверьте свой код для копирования.

Также запустите ваше приложение под инструментом Зомби, если вы еще этого не сделали.

Если вы принимаете перетаскивание из перетаскиваемой вставки и выполняете фактическую работу в другом потоке асинхронно, вы должны сохранить сам монтажный щит, или в противном случае он может быть освобожден при возврате функции в основном потоке.

Это может произойти на стороне перетаскивания источника.

Например:

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

}

Другие вопросы по тегам