2013-04-24 2 views
0

동시 nsoperation을 구현했으며 ARC를 활성화했습니다. 이제 고객이 재현 할 수없는 충돌이 발생했습니다.NSOperation 충돌 on isCancelled

Date/Time:  2013-04-24 12:23:34.925 -0400 
OS Version:  Mac OS X 10.8.3 (12D78) 
Report Version: 10 

Interval Since Last Report:   30946 sec 
Crashes Since Last Report:   1 
Per-App Interval Since Last Report: 33196 sec 
Per-App Crashes Since Last Report: 1 
Anonymous UUID:      FB8460EE-5199-C6FB-55DC-F927D7F81A80 

Crashed Thread: 15 Dispatch queue: com.apple.root.default-priority 

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: EXC_I386_GPFLT 

Application Specific Information: 
objc_msgSend() selector name: isCancelled 


Thread 15 Crashed:: Dispatch queue: com.apple.root.default-priority 
0 libobjc.A.dylib     0x00007fff877f1250 objc_msgSend + 16 
1 Myapp 0x000000010a608807 0x10a601000 + 30727 
2 Myapp 0x000000010a650575 0x10a601000 + 324981 
3 com.apple.Foundation   0x00007fff8b66212f -[NSBlockOperation main] + 124 
4 com.apple.Foundation   0x00007fff8b638036 -[__NSOperationInternal start] + 684 
5 com.apple.Foundation   0x00007fff8b63f861 __block_global_6 + 129 
6 libdispatch.dylib    0x00007fff832d0f01 _dispatch_call_block_and_release + 15 
7 libdispatch.dylib    0x00007fff832cd0b6 _dispatch_client_callout + 8 
8 libdispatch.dylib    0x00007fff832ce1fa _dispatch_worker_thread2 + 304 
9 libsystem_c.dylib    0x00007fff87d19d0b _pthread_wqthread + 404 
10 libsystem_c.dylib    0x00007fff87d041d1 start_wqthread + 13 

내 코드는 다음과 같습니다 :

-(void)start 
{   
    // Always check for cancellation before launching the task. 
    if ([self isCancelled]) 
    { 
     // Must move the operation to the finished state if it is canceled. 
     [self onCancelSyncOperation]; 
     return; 
    } 

    // If the operation is not canceled, begin executing the task. 
    [self willChangeValueForKey:@"isExecuting"]; 
    [NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil]; 
    executing = YES; 
    [self didChangeValueForKey:@"isExecuting"]; 
} 

- (void)onCancelSyncOperation 
{ 
    [self willChangeValueForKey:@"isFinished"]; 
    [self willChangeValueForKey:@"isExecuting"]; 

    executing = NO; 
    finished = YES; 

    [self didChangeValueForKey:@"isExecuting"]; 
    [self didChangeValueForKey:@"isFinished"]; 
} 

그것은 nsoperation 것 같아이 이미 출시 그는 나에게 다음과 충돌 로그를 보내? 그걸 확인하려고 할 때 무죄인가?

이것이 가능합니까?

+0

'self'는'NSOperation'의 하위 클래스입니다. – elslooo

+0

이 클래스는 NSOperation의 서브 클래스입니다 – pdiddy

+0

'1 Myapp 0x000000010a608807 0x10a601000 + 30727 2 Myapp 0x000000010a650575 0x10a601000 + 324981'을 (를) 기호화 할 수 있었습니까? 이것은 좋은 통찰력을 제공 할 수 있습니다. –

답변

0

누구든지이 로그를보고 앱이 왜 충돌 하는지를 알 수 있다고 생각하지 않습니다. 난 당신의 코드를 보지 못했지만 충돌 로그를 자르므로 시스템 모듈 (lib.dispatch ..., com.apple ...) 만 보여줍니다. 일반적으로 오류는 "com.myname ..."이 처음 나타날 때 발생합니다.

objc_msgSend()과 함께 나타납니다 EXC_BAD_ACCESS (SIGSEGV) 충돌 이런 종류의, 아마 당신이 객체에 메시지를 시도 (또는 다른 말로 : 객체의 메서드를 호출)하고 의미 경우 더 이상 없다입니다. 이 객체를 호출하면 기회를 찾거나 지연 시키거나 다른 스레드 또는 블록에서 호출하면 매우 쉽게 찾을 수 있습니다.

가장 큰 원인은 NSZombies가 활성화되어있는 할당 또는 누수 도구 (기본값)를 사용하여 Instrument로 앱을 검사하는 것입니다. Xcode 내에서 Instruments를 시작할 수 있습니다. 그런 다음 충돌을 재현 해보십시오. 성공하면 크래시가 발생한 클래스와 위치를 찾을 수 있습니다.

이 답변으로 무엇을해야할지 모르시는 경우 Apple의 WWDC 개발자 비디오를 확인하십시오. 인스트루먼트를 사용하여 응용 프로그램을 프로파일하는 방법을 보여주는 몇 가지가 있습니다 ([무료] 개발자 계정이 필요합니다. 동영상에 액세스).

행운을 빈다.

+0

및 btw : 비동기 블록 (dispatch_async 포함)을 사용하는 것에 비해 장점을 제공하는 NSThread를 사용해야 할 필요가 있습니까? – auco

+0

이 코드는 Apple 동시성 프로그래밍 가이드를 기반으로합니다. 귀하의 회신에 대한 Thx. 충돌을 재현하기가 어렵습니다. – pdiddy

+0

동시성 프로그래밍 가이드는 몇 살입니까? 2012 년 이전 인 경우 온라인 버전을 확인하십시오. NSThreads에서 Async Dispatching으로 마이그레이션하는 방법에 대한 가이드도 있습니다. 이것은 NSThreads 및 작업을 처리하는 것보다 훨씬 쉽습니다. :-) https://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html – auco

관련 문제