1

我正在尝试在我的应用程序中的所有按钮上添加自定义点击声音。我为 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 对象进行强引用?或者还有其他更好的方法来让它工作吗?

4

1 回答 1

2

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

于 2013-03-18T09:38:15.670 回答