2013-02-28 2 views
0

Я пытаюсь проверить свое приложение Mac os, он работал хорошо на 10.8, однако, когда я начал тестировать его на mac 10.6.3 (iatkos s3), у меня возникла проблема ,performSelectorInBackground: разбился сразу на mac os x 10.6.3

Во-первых, я должен использовать отдельный компьютер для установки 10.6.3, так как мой режим macbook не позволит мне установить 10.6.3 (аппаратное обеспечение более новое, чем программное обеспечение). Я сделал это, в xcode я запустил его, запустил файл .app и поместил его в папку приложения 10.6.3, а затем запустил его.

Я положил некоторые журнал трассировки там и вот мой код:

- (void) startMethodInBackground: (id) sender { 
    NSLog(@"line 101"); //this shows 
    [self performSelectorInBackground:@selector(myOtherMethod:) withObject:sender]; 
    NSLog(@"line 102"); //not showing 
} 

- (void) myOtherMethod: (id) sender { 
    NSLog(@"line 201"); //not showing 
    @autoreleasepool { 
     NSLog(@"line 202"); //again not showing 
     @synchronized (self) { 
      NSLog(@"line 203"); //not showing 
      ... ... 
     } 
    } 
} 



Version:   1.0 (1) 
Code Type:  X86-64 (Native) 
Parent Process: launchd [1126] 

Date/Time:  2013-02-28 16:53:10.668 -0500 
OS Version:  Mac OS X 10.6.3 (10D573) 
Report Version: 6 

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000 
Crashed Thread: 2 
... (too long so I trimmed it) 
... 
    Thread 2 Crashed: 
0 ???        000000000000000000 0 + 0 
1 com.apple.Foundation   0x00007fff814e4ead __NSThread__main__ + 1429 
2 libSystem.B.dylib    0x00007fff86db38b6 _pthread_start + 331 
3 libSystem.B.dylib    0x00007fff86db3769 thread_start + 13 

Thread 2 crashed with X86 Thread State (64-bit): 
    rax: 0x0000000000000000 rbx: 0x0000000100863400 rcx: 0x0000000000000000 rdx: 0x00000001001417b0 
    rdi: 0x00000001001417b0 rsi: 0x0000000000000000 rbp: 0x0000000100480c90 rsp: 0x0000000100480b08 
    r8: 0x0000000000000000 r9: 0x0000000100201530 r10: 0x0000000100210870 r11: 0x0000000100002120 
    r12: 0x00007fff5fbfe800 r13: 0x0000000000001b07 r14: 0x00007fff814e4918 r15: 0x0000000102e0ec20 
    rip: 0x0000000000000000 rfl: 0x0000000000010202 cr2: 0x0000000000000000 

, как вы можете увидеть в моем коде, как только я называю myOtherMethod: с помощью performSelectorInBackground :, он разбился !!

поэтому мои вопросы:

  1. какая-либо причина, почему призвании performSelectorInBackground разбился ?? Я проверил метод performSelectorInBackground, и он должен работать нормально на 10.6 (яблочный документ говорит 10.5 или новее), поэтому я действительно должен к тому, что произошло !!!

  2. Отчет о сбоях действительно не имеет для меня никакого смысла, поэтому в реальной жизни, как вы можете отлаживать такой отчет? в xcode, если есть какие-либо проблемы, он сработает и скажет мне, какой метод вызвал проблему и в чем была проблема, но, как вы можете видеть, отчет о сбое не сказал мне многого!

Любая помощь приветствуется. Josh

+0

Возможно ли, что ваш объект освобожден? – paulmelnikow

ответ

0

Это похоже на поврежденный стек.

Возможно, вы выделяете огромные объемы памяти в myOtherMethod, как большой массив C? Что происходит, когда вы вызываете myOtherMethod в основной теме?

+0

он не имеет ничего общего с распределением памяти. Я создал фиктивное приложение, которое использовало performSelectorsInBackground: для вызова метода фиктивного метода, внутри этого фиктивного метода, у меня был @ autoreleasepool, затем @ synchronized (self) и ничего, кроме простых простейших. Если я вытащу @ синхронизированный, он не будет разбиваться, если я поставил @synchronized, он разбился. Причина, по которой я использовал синхронизацию, заключается в том, что я хочу убедиться, что несколько потоков не запускают myOtherMethod одновременно, если в потоке 1 выполняется myOtherMethod, поток 2 должен ждать завершения потока 1. Но почему он синхронизировал разбился на 10.6, но не на 10.8 ???? – Josh