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
관련 코드 :
performSelectorOnMainThread
에 충돌 것으로 보인다
- (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;
}
하지만 난 돈 ' 정말로 이유를 알지 못합니다. 내가 뭘 잘못하고 있나?
또한 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로 수행하는 작업을 Apple이 수행하지 않습니까? – TheAmateurProgrammer
고마워요. 다른 이벤트에서 여전히 다른 충돌이 있습니다. 또한 변경된 메모리 관리와 관련이있는 것으로 보입니다. – Albert
@theAmateurProgrammer : 그들은 참조로 전달합니다, 그렇습니다. (여전히 허용됩니다!) 그러나 전달하기 위해'NSError ** '를'id'로 캐스트하지 않습니다. 인수가'NSError ** '인 곳에'-performSelector : withObject :'를 사용하면 같은 충돌을 보게 될 것입니다. 왜냐하면 그 메소드는 매개 변수가 객체이기를 기대하기 때문입니다. –