1
由于OSX 10.8,我得到我的屏幕保护程序崩溃:崩溃的屏幕保护程序,因为OSX 10.8
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libobjc.A.dylib 0x00007fff94749790 objc_msgSend_vtable13 + 16
1 com.apple.Foundation 0x00007fff9508941f -[NSObject(NSThreadPerformAdditions) performSelector:onThread:withObject:waitUntilDone:modes:] + 163
2 com.apple.Foundation 0x00007fff950892f8 -[NSObject(NSThreadPerformAdditions) performSelectorOnMainThread:withObject:waitUntilDone:] + 131
3 albertzeyer.PictureSlider 0x000000010f6e64c7 -[PictureSliderView nextFileName] + 71 (PictureSliderView.m:69)
4 albertzeyer.PictureSlider 0x000000010f6e6675 -[PictureSliderView loadNext] + 53 (PictureSliderView.m:86)
5 albertzeyer.PictureSlider 0x000000010f6e695f -[PictureSliderView initWithFrame:isPreview:] + 447 (PictureSliderView.m:116)
6 com.apple.ScreenSaver 0x00007fff968c7cb5 -[ScreenSaverModules loadModule:frame:isPreview:] + 968
相关的代码:
- (void) queuedFileNamesPop:(NSString**)fn {
if([queuedFileNames count] > 0) {
*fn = [queuedFileNames objectAtIndex:0];
[queuedFileNames removeObjectAtIndex:0];
}
}
- (NSString*) nextFileName
{
NSString* fn = nil;
[self performSelectorOnMainThread:@selector(queuedFileNamesPop:) withObject:(id)&fn waitUntilDone:YES];
if(!fn) {
[nextFileNameLock lock];
fn = [[NSString alloc] initWithUTF8String:FileQueue_getNextFile()];
[nextFileNameLock unlock];
}
return fn;
}
这似乎崩溃的performSelectorOnMainThread
但我不”真的明白为什么。有什么明显的我做错了吗?
此外,它只在从ScreenSaverEngine运行时才会崩溃。我也有一个小的虚拟应用程序,它使用相同的视图来测试屏幕保护程序,它不会在那里崩溃。
编辑:我问一些非常相关的(相同的代码)前一阵子here。我不知道为什么我还没有考虑最终的解决方案之一...
编辑:由乔纳森建议的代码更改后,不会再发生这种碰撞。然而,在其他事件,我让其他崩溃,与此回溯:
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 com.apple.CoreFoundation 0x00007fff8f9aefe8 CFRelease + 248
1 com.apple.CoreFoundation 0x00007fff8f9d6770 -[__NSArrayM removeObjectAtIndex:] + 400
2 albertzeyer.PictureSlider 0x0000000108c54425 -[PictureSliderView queuedFileNamesPop:] + 197 (PictureSliderView.m:64)
3 com.apple.Foundation 0x00007fff95089450 -[NSObject(NSThreadPerformAdditions) performSelector:onThread:withObject:waitUntilDone:modes:] + 212
4 com.apple.Foundation 0x00007fff950892f8 -[NSObject(NSThreadPerformAdditions) performSelectorOnMainThread:withObject:waitUntilDone:] + 131
5 albertzeyer.PictureSlider 0x0000000108c544b0 -[PictureSliderView nextFileName] + 128 (PictureSliderView.m:71)
6 albertzeyer.PictureSlider 0x0000000108c54665 -[PictureSliderView loadNext] + 53 (PictureSliderView.m:88)
7 albertzeyer.PictureSlider 0x0000000108c54cce -[PictureSliderView keyDown:] + 382 (PictureSliderView.m:178)
8 com.apple.AppKit 0x00007fff924ad8e0 -[NSWindow sendEvent:] + 9687
或者这样:
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libobjc.A.dylib 0x00007fff947497d0 objc_msgSend_vtable14 + 16
1 com.apple.CoreFoundation 0x00007fff8f9aef9a CFRelease + 170
2 com.apple.CoreFoundation 0x00007fff8f9d6770 -[__NSArrayM removeObjectAtIndex:] + 400
3 albertzeyer.PictureSlider 0x00000001023fac51 -[PictureSliderView keyDown:] + 257 (PictureSliderView.m:172)
4 com.apple.AppKit 0x00007fff924ad8e0 -[NSWindow sendEvent:] + 9687
我还没有确定它们是否是相关的或独立的。
编辑:他们没有关系。他们是因为别的地方还有另外的[fn release]
。
苹果不是在做阿尔伯特在NSError中做的事情吗? – TheAmateurProgrammer 2012-07-26 12:54:13
谢谢,就是这样。在其他一些事件中,我还有其他一些崩溃 - 他们似乎也与更改内存管理有关。 – Albert 2012-07-26 12:57:43
@theAmateurProgrammer:它们通过引用传递,是的(但仍然允许!),但是它们从不会将'NSError **'''传递给'id'来传递它。如果使用'-performSelector:withObject:'参数是一个'NSError **',你会看到同样的崩溃,因为该方法期望该参数是一个对象。 – 2012-07-26 13:05:41