1

私のiPhoneアプリには、リリースしたAVAudioPlayerのインスタンスがあります(そのため、代わりに別のURLで別のインスタンスを初期化できます)。通常、これは正常に機能しますが、メインスレッドでデッドロックが発生することがあります。

Thread 1, Queue : com.apple.main-thread
#0  0x357e00d8 in __psynch_mutexwait ()
#1  0x3497d67a in pthread_mutex_lock ()
#2  0x359997a6 in -[AVAudioPlayer privCommonCleanup] ()
#3  0x35999bb6 in -[AVAudioPlayer dealloc] ()
#4  0x3338a174 in _objc_rootRelease ()

アプリは停止し、入力を受け入れません。クラッシュも何もありません、それはただ止まります。

アプリ内の他のスレッドとは相互作用していないようですが、完全を期すために、次のようになっています。

Thread 2, Queue : com.apple.libdispatch-manager
#0  0x357d03a8 in kevent ()
#1  0x33b03eaa in _dispatch_mgr_invoke ()
#2  0x33b03bc8 in _dispatch_mgr_thread ()
Thread 3, Queue : (null)
#0  0x357e0cd4 in __workq_kernreturn ()
#1  0x34983f3c in _pthread_wqthread ()
#2  0x34983cd0 in start_wqthread ()
Thread 4 WebThread, Queue : (null)
#0  0x357d0004 in mach_msg_trap ()
#1  0x357d0200 in mach_msg ()
#2  0x3573e3f2 in __CFRunLoopServiceMachPort ()
#3  0x3573d12a in __CFRunLoopRun ()
#4  0x356c04a4 in CFRunLoopRunSpecific ()
#5  0x356c036c in CFRunLoopRunInMode ()
#6  0x37406ca2 in _ZL12RunWebThreadPv ()
#7  0x34989734 in _pthread_start ()
#8  0x349895f0 in thread_start ()
Thread 5, Queue : (null)
#0  0x357e0cd4 in __workq_kernreturn ()
#1  0x34983f3c in _pthread_wqthread ()
#2  0x34983cd0 in start_wqthread ()
Thread 6 AQClient, Queue : (null)
#0  0x357d0004 in mach_msg_trap ()
#1  0x357d0200 in mach_msg ()
#2  0x3573e3f2 in __CFRunLoopServiceMachPort ()
#3  0x3573d12a in __CFRunLoopRun ()
#4  0x356c04a4 in CFRunLoopRunSpecific ()
#5  0x356c036c in CFRunLoopRunInMode ()
#6  0x34e2cb2e in GenericRunLoopThread::Entry(void*) ()
#7  0x34db3ca2 in CAPThread::Entry(CAPThread*) ()
#8  0x34989734 in _pthread_start ()
#9  0x349895f0 in thread_start ()
Thread 7, Queue : (null)
#0  0x357d0004 in mach_msg_trap ()
#1  0x357d0200 in mach_msg ()
#2  0x3573e3f2 in __CFRunLoopServiceMachPort ()
#3  0x3573d12a in __CFRunLoopRun ()
#4  0x356c04a4 in CFRunLoopRunSpecific ()
#5  0x356c036c in CFRunLoopRunInMode ()
#6  0x34af9b74 in -[NSRunLoop(NSRunLoop) runMode:beforeDate:] ()
#7  0x34b13522 in -[NSRunLoop(NSRunLoop) run] ()
#8  0x000c83fe in +[AFURLConnectionOperation networkRequestThreadEntryPoint:] at /Users/hiltonc/Documents/Code/LDSMobileApps/LDSScriptureHeroes/External/LDSMobileAccount/External/AFNetworking/AFNetworking/AFURLConnectionOperation.m:151
#9  0x34b05a80 in -[NSThread main] ()
Thread 8 com.apple.NSURLConnectionLoader, Queue : (null)
#0  0x357d0004 in mach_msg_trap ()
#1  0x357d0200 in mach_msg ()
#2  0x3573e3f2 in __CFRunLoopServiceMachPort ()
#3  0x3573d12a in __CFRunLoopRun ()
#4  0x356c04a4 in CFRunLoopRunSpecific ()
#5  0x356c036c in CFRunLoopRunInMode ()
#6  0x34b05bb8 in +[NSURLConnection(Loader) _resourceLoadLoop:] ()
#7  0x34b05a80 in -[NSThread main] ()
Thread 12 com.apple.CFSocket.private, Queue : (null)
#0  0x357e0570 in select$DARWIN_EXTSN ()
#1  0x35742640 in __CFSocketManager ()
#2  0x34989734 in _pthread_start ()
#3  0x349895f0 in thread_start ()

この問題の根底に到達する方法が本当にわかりません。何か案は?

4

1 に答える 1

3

いずれかを解放してデリゲート呼び出しで置き換えると、この種の問題が確実に発生します。基本的に、(ARCの下で)実行したい:

avPlayer.delegate = nil
[avPlayer stop];
avPlayer = nil; //overkill
avPlayer = [AVPlayer alloc] init....
avPlayer ....

デリゲート メソッドで上記を実行する必要がある場合は、上記のコードをブロックでラップし、メイン キューにディスパッチします (avPlayer は ivar またはプロパティであると想定しています)。

于 2012-07-17T13:14:00.753 に答える