最近新的项目上莫名其妙出现了很多闪退,我就很诧异,我就是按照以前的方式写的代码就这么用的怎么到这就不管用了,深深怀疑自己水平中...
经过排查,发现了这个大深坑:讯飞语音
原理就在于
注意到了吧!
原来人家是要释放哒!!有多少人跟我一样做项目先搞一个RootViewController作为所有界面控制器的父视图控制器的?有木有?有木有??!!
我就SB一样习惯性地集成在了自定义的父视图控制器上;
所以答案就在这里啦!!!!
如果你把讯飞集成在自己定义的父视图控制器上的话,一旦在语音未结束的情况下进行跳转,讯飞就会来不及释放,然后就闪退!!!!
好吧...
于是我就集成在了APPdelegate上(切记一定要写在APPdelegate上!)
@interface AppDelegate ()<IFlySpeechSynthesizerDelegate>
{
IFlySpeechSynthesizer * _iFlySpeechSynthesizer;
}
@end
@implementation AppDelegate
#pragma mark - 集成讯飞
- (void)initXunFei {
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(voice:) name:@"xunfei" object:nil];
NSString *initString = [[NSString alloc] initWithFormat:@"appid=%@",XUNFEI_VOICE_APPID];
[IFlySpeechUtility createUtility:initString];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"xunfei" object:nil];
}
- (void)voice:(NSNotification *)sender {
[self setupXunFeiWithText:[NSString stringWithFormat:@"%@",sender.object]];
}
#pragma mark -讯飞语音
- (void)setupXunFeiWithText:(NSString *)text {
// 创建合成对象,为单例模式
_iFlySpeechSynthesizer = [IFlySpeechSynthesizer sharedInstance];
_iFlySpeechSynthesizer.delegate = self;
//设置语音合成的参数
//语速,取值范围 0~100
[_iFlySpeechSynthesizer setParameter:@"50" forKey:[IFlySpeechConstant SPEED]];
//音量;取值范围 0~100
[_iFlySpeechSynthesizer setParameter:@"60" forKey: [IFlySpeechConstant VOLUME]];
//发音人,默认为”xiaoyan”;可以设置的参数列表可参考个 性化发音人列表
[_iFlySpeechSynthesizer setParameter:@"xiaoyan" forKey: [IFlySpeechConstant VOICE_NAME]];
//音频采样率,目前支持的采样率有 16000 和 8000
[_iFlySpeechSynthesizer setParameter:@"8000" forKey: [IFlySpeechConstant SAMPLE_RATE]];
//asr_audio_path保存录音文件路径,如不再需要,设置value为nil表示取消,默认目录是documents
[_iFlySpeechSynthesizer setParameter:@"tts.pcm" forKey: [IFlySpeechConstant TTS_AUDIO_PATH]];
//启动合成会话
[_iFlySpeechSynthesizer startSpeaking:text];
}
//合成结束,此代理必须要实现
- (void) onCompleted:(IFlySpeechError *) error{
}
//合成开始
- (void) onSpeakBegin{
}
//合成缓冲进度
- (void) onBufferProgress:(int) progress message:(NSString *)msg{
}
//合成播放进度
- (void) onSpeakProgress:(int) progress{
}
@end
在项目里的任何地方需要使用的时候,只需要这样:
[[NSNotificationCenter defaultCenter]postNotificationName:@"xunfei" object:@"喂!110吗?又翻车了,对对,还是讯飞,还是那个弯!!!];