带有ARC的类别中的AVAudioPlayer

时间:2013-03-18 09:06:53

标签: ios objective-c automatic-ref-counting avaudioplayer

我正在尝试在我的应用程序中的所有按钮上添加自定义单击声音。我已经为UIButton创建了一个类类别,其中包含以下代码:

NSURL *soundURL = [NSURL fileURLWithPath:[[NSBundle bundleWithIdentifier:@"com.apple.UIKit"] pathForResource:@"Tock" ofType:@"aiff"]];
NSError *error;

AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];

if(audioPlayer == nil){
    NSLog(@"%@", [error description]);
} else{
    [audioPlayer play];
}

所有这些都在以下内容中执行:- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

但据我所知,ARC(我正在使用)存在一个常见问题。 audioPlayer对象似乎在播放声音之前被释放。我也看过AudioServicesPlaySystemSound();。但是我现在别无选择,因为我的应用程序中需要一个音量控制器而且我没有办法在不离开应用程序的情况下改变系统音量。

我的问题是:有没有办法在UIButton类类别中对我的audioPlayer对象进行强有力的引用?或者还有其他任何可能更好的方法吗?

1 个答案:

答案 0 :(得分:2)

在类别中添加任何对象关系时,始终值得查看关联对象。使用objc_setAssociatedObject()objc_getAssociatedObject()功能。确保为密钥使用唯一的指针值,在您的情况下,您肯定希望使用其中一个保留关联策略来确保对象的生命周期是合适的。