1

[NSWorkspace setIcon:forFile:options:] API でクラッシュすることがあります。

どんな助けでも大歓迎です。ここにクラッシュ スタックがあります。

0   libsystem_kernel.dylib          0x00007fff85bfbe56 __semwait_signal_nocancel + 10
1   libsystem_c.dylib               0x00007fff8c04818b nanosleep$NOCANCEL + 139
2   libsystem_c.dylib               0x00007fff8bfe7c78 usleep$NOCANCEL + 53
3   libsystem_c.dylib               0x00007fff8bfe7aa6 abort + 187
4   libsystem_c.dylib               0x00007fff8c04684c free + 389
5   com.apple.CoreServices.CarbonCore   0x00007fff8df7aaf7 CSMemDisposePtr + 23
6   com.apple.CoreServices.CarbonCore   0x00007fff8df7aaba CSMemDisposeHandle + 79
7   com.apple.CoreServices.CarbonCore   0x00007fff8df7c355 DisposeHandle + 9
8   com.apple.AppKit                0x00007fff90356598 -[NSWorkspace setIcon:forFile:options:] + 566

ここにコードがあります、

static NSImage  *FolderIcon = nil;

if(!FolderIcon) {
        FolderIcon = [[NSImage imageNamed:@"xxx.icns"] retain];
}

if(![[NSWorkspace sharedWorkspace] setIcon: FolderIcon
                                       forFile:Path
                                       options:0]) {
    NSLog(@"error");
}

静的アイコンを使用しているので、ポインタがぶら下がっている可能性はないと思います。また、存在しないファイルパスを渡すと「NO」を返します。しかし、それはクラッシュしていません。

これはめったに再現できません..再現するとエラーが貼り付けられます

4

1 に答える 1

0

-setIcon:forFile:options:一度に複数のスレッドから呼び出すべきではありません。

ドキュメントから:

このメソッドは、アプリのどのスレッドからでも安全に呼び出すことができますが、一度に 1 つのスレッドからのみ呼び出す必要があります。

于 2016-04-15T12:53:44.760 に答える