Очень трудно охотиться за этим. Производственное приложение периодически падает (~ 2% пользователей). Это карточная игра, поэтому на картах много постукиваний. Всякий раз, когда вы нажимаете на карту, он издает звук. Авария происходит, казалось бы, случайно, но я могу воспроизвести ее, нажав на карты некоторое время, а затем случайно произойдет сбой.
Невозможно надежно воспроизвести, но после долгих сеансов с использованием инструментов / зомби я вижу, что объект Zombie является объектом AVAudioPlayer
. Это простое приложение для карточных игр (не для SK и других игровых фреймворков - все для UIKit / обычного Objective C). Я использую очень простую реализацию AVAudioPlayer
. Все подробности ниже.
Трассировка стека:
Crashed: com.apple.main-thread
0 libobjc.A.dylib 0x206270d70 objc_msgSend + 16
1 Foundation 0x207b3d42c __NSThreadPerformPerform + 336
2 CoreFoundation 0x20701a0e0 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
3 CoreFoundation 0x20701a060 __CFRunLoopDoSource0 + 88
4 CoreFoundation 0x207019944 __CFRunLoopDoSources0 + 176
5 CoreFoundation 0x207014810 __CFRunLoopRun + 1040
6 CoreFoundation 0x2070140e0 CFRunLoopRunSpecific + 436
7 GraphicsServices 0x20928d584 GSEventRunModal + 100
8 UIKitCore 0x2343a8c00 UIApplicationMain + 212
9 <app name> 0x1007930f0 main (main.m:14)
10 libdyld.dylib 0x206ad2bb4 start + 4
AppDelegate.m didFinishLaunchingWithOptions
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil];
BOOL success = [[AVAudioSession sharedInstance] setActive:YES error:nil];
ViewController.h
@property (strong, nonatomic) AVAudioPlayer *audioPlayer;
ViewController.m
-(void) playSound:(NSString *) strSoundName {
NSString *fileName = @"Move_1";
NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"aif"];
NSURL *soundFileURL = [NSURL fileURLWithPath:soundFilePath];
float volume = 0.5;
self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:nil];
[self.audioPlayer setVolume:volume];
[self.audioPlayer play];
}
История ссылок AVAudioPlayer
handleTap:::
- метод, который вызывает playSound