2011-01-29 4 views
1

Один из наших клиентов видит аварию, как это иногда при вставке:Что может привести к сбою - [NSPasteboard types]?

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 управляет кросс-прикладными пастами, происходит неправильно и сбой. Кто-нибудь сталкивался с чем-то вроде этого или знал, что может вызвать это?

ответ

0

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

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

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

}

+0

Сохранять в вашем примере не является необходимым; блок все равно сохранит картон. И нет, это не проблема, о которой я вижу несколько сообщений. –

+0

Блок сохраняет картон только в том случае, если вы используете его внутри блока. Вы можете использовать один из своих картонных элементов, который имеет только слабую ссылку на картона. Для меня это решило частые сбои. –