2013-03-18 3 views
1

내 응용 프로그램의 모든 버튼에 사용자 정의 클릭 사운드를 추가하려고합니다. 나는 그 안에 다음 코드로있는 UIButton에 대한 클래스 범주를 만들었습니다ARC가있는 클래스 카테고리의 AVAudioPlayer

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() 기능을 사용하십시오. 키에 대해 고유 한 포인터 값을 사용해야하며, 경우에 따라 보유 연합 정책 중 하나를 사용하여 개체의 수명이 적절한 지 확인해야합니다.