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:一次从多个线程调用。

文档

从应用程序的任何线程调用此方法是安全的,但一次只能从一个线程调用它。

于 2016-04-15T12:53:44.760 回答