//
// AudioTool.h
// 工具类
#import <Foundation/Foundation.h>
@interface AudioTool : NSObject
/**
* 播放音效
*
* @param filename 音效文件名
*/
+ (void)playSound:(NSString *)filename;
/**
* 销毁音效
*
* @param filename 音效文件名
*/
+ (void)disposeSound:(NSString *)filename;
@end
//
// AudioTool.m
#import "AudioTool.h"
#import <AVFoundation/AVFoundation.h>
@implementation AudioTool
//字典 filename作为key,soundID作为value
//存放所有的音效ID
static NSMutableDictionary *_soundIDDict;
/**
* 初始化
*/
+ (void)initialize
{
_soundIDDict = [NSMutableDictionary dictionary];
}
/**
* 播放音效
*
* @param filename 音效文件名
*/
+ (void)playSound:(NSString *)filename
{
if (!filename) return;
//1.从字典中取出soundID
SystemSoundID soundID = [_soundIDDict[filename] unsignedIntValue];
if (!soundID) { //创建
//加载音效文件
NSURL *url = [[NSBundle mainBundle] URLForResource:filename withExtension:nil];
if(!url) return;
//创建音效ID
AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &soundID);
//存入字典
_soundIDDict[filename] = @(soundID);
}
//2.播放
AudioServicesPlaySystemSound(soundID);
}
/**
* 销毁音效
*
* @param filename 音效文件名
*/
+ (void)disposeSound:(NSString *)filename
{
if (!filename) return;
SystemSoundID soundID = [_soundIDDict[filename] unsignedIntValue];
if (!soundID) {
//销毁音效ID
AudioServicesDisposeSystemSoundID(soundID);
//从字典中移除
[_soundIDDict removeObjectForKey:filename];
}
}
@end
使用:
//
// ViewController.m
#import "ViewController.h"
#import "AudioTool.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
//播放
[AudioTool playSound:@"m_03.wav"];
[AudioTool playSound:@"m_04.wav"];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
//销毁音频ID
[AudioTool disposeSound:@"m_03.wav"];
}
@end