2012-07-26 104 views
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]

回答

2

您正在将非对象转换为对象。 (看起来像他们可能已经开始建设NSObject与ARC启用)这可能是在Objective-C的运行时或在基金的内存管理的变化而不是(id)&fn

冲突的,试试这个:

NSValue *fnHandle = [NSValue valueWithPointer: &fn]; 
[self performSelectorOnMainThread: @selector(queuedFileNamesPop:) withObject: fnHandle waitUntilDone: YES]; 

这传递包裹在对象中的fn的地址。然后,在被调用的方法中:

- (void)queuedFileNamesPop: (NSValue *)fnHandle { 
    NSString **fn = [fnHandle pointerValue]; 
    if (fn) { 
     // existing code here 
    } 
} 

这确保了始终遵循正确的内存管理。

+0

苹果不是在做阿尔伯特在NSError中做的事情吗? – TheAmateurProgrammer 2012-07-26 12:54:13

+0

谢谢,就是这样。在其他一些事件中,我还有其他一些崩溃 - 他们似乎也与更改内存管理有关。 – Albert 2012-07-26 12:57:43

+1

@theAmateurProgrammer:它们通过引用传递,是的(但仍然允许!),但是它们从不会将'NSError **'''传递给'id'来传递它。如果使用'-performSelector:withObject:'参数是一个'NSError **',你会看到同样的崩溃,因为该方法期望该参数是一个对象。 – 2012-07-26 13:05:41