2012-07-26 2 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 

관련 코드 :

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] 어딘가에 있기 때문입니다.

답변

2

개체가 아닌 개체를 개체로 캐스팅합니다. (. 그들이 활성화 ARC와 NSObject 구축을 시작하고있는 것 같습니다)이 아마

대신 (id)&fn의 재단 목적-C 런타임 또는 메모리 관리 변화와 충돌이 시도 :

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로 수행하는 작업을 Apple이 수행하지 않습니까? – TheAmateurProgrammer

+0

고마워요. 다른 이벤트에서 여전히 다른 충돌이 있습니다. 또한 변경된 메모리 관리와 관련이있는 것으로 보입니다. – Albert

+1

@theAmateurProgrammer : 그들은 참조로 전달합니다, 그렇습니다. (여전히 허용됩니다!) 그러나 전달하기 위해'NSError ** '를'id'로 캐스트하지 않습니다. 인수가'NSError ** '인 곳에'-performSelector : withObject :'를 사용하면 같은 충돌을 보게 될 것입니다. 왜냐하면 그 메소드는 매개 변수가 객체이기를 기대하기 때문입니다. –

관련 문제