首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自OSX10.8以来ScreenSaver崩溃

自OSX10.8以来ScreenSaver崩溃
EN

Stack Overflow用户
提问于 2012-07-26 12:27:52
回答 1查看 494关注 0票数 1

从OSX 10.8开始,我的屏幕保护程序就崩溃了:

代码语言:javascript
复制
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

有关守则:

代码语言:javascript
复制
- (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建议的代码更改之后,此崩溃不再发生。然而,在其他事件中,我会看到其他的崩溃,通过这个回溯:

代码语言:javascript
复制
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

或者这个:

代码语言:javascript
复制
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]在其他地方。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-26 12:45:30

你在把一个非物体投射到一个物体上。这可能与Objective运行时或基金会中的内存管理更改相冲突(看起来它们可能已经开始构建启用了ARC的NSObject )。

(id)&fn不同,您可以尝试如下:

代码语言:javascript
复制
NSValue *fnHandle = [NSValue valueWithPointer: &fn];
[self performSelectorOnMainThread: @selector(queuedFileNamesPop:) withObject: fnHandle waitUntilDone: YES];

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

代码语言:javascript
复制
- (void)queuedFileNamesPop: (NSValue *)fnHandle {
    NSString **fn = [fnHandle pointerValue];
    if (fn) {
        // existing code here
    }
}

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11669298

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档