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 から実行した場合にのみクラッシュします。同じビューを使用してスクリーンセーバーをテストする小さなダミーアプリもあり、そこでクラッシュしません。
編集:私は非常に関連するもの(同じコード)について少し前にここで尋ねました。結局、なぜ私はそれらの解決策のいずれかを取らなかったのだろうか...
編集: Jonathan によって提案されたコード変更の後、このクラッシュは発生しなくなりました。ただし、他のイベントでは、次のバックトレースで他のクラッシュが発生しています。
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]
どこか別の場所に追加されたためです。