1

お客様の 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 は所有者オブジェクトを保持しますか? はい、ペーストボードは渡された所有者を保持します。したがって、このクラッシュは次のいずれかである必要があります。

  • 私のコードの過剰リリース。これにより、ペーストボードがまだオブジェクトへの参照を保持している間にオブジェクトの割り当てが解除されます。ペーストボードとは関係なく問題が発生すると予想されるため、これはありそうもないと思います。また、それを示唆するクラッシュ (レポート) は 1 つも見たことがありません。
  • 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 に答える