Próbuję odtworzyć dźwięk kliknij na każdego kliknięcia przycisku w mojej aplikacji za to stworzył klasę Utility którego .h i .m jest następującaMemory Leak kiedy zachowując własność
.h plik
@interface SoundPlayUtil : NSObject<AVAudioPlayerDelegate,AVAudioSessionDelegate>
{
AVAudioPlayer *audioplayer;
}
@property (retain, nonatomic) AVAudioPlayer *audioplayer;
-(id)initWithDefaultClickSoundName;
-(void)playIfSoundisEnabled;
@end
pliku .m
@implementation SoundPlayUtil
@synthesize audioplayer;
-(id)initWithDefaultClickSoundName
{
self = [super init];
if (self)
{
NSString* BS_path_blue=[[NSBundle mainBundle]pathForResource:@"click" ofType:@"mp3"];
self.audioplayer =[[AVAudioPlayer alloc]initWithContentsOfURL:[NSURL fileURLWithPath:BS_path_blue] error:NULL];
[self.audioplayer prepareToPlay];
}
return self;
}
-(void)playIfSoundisEnabled
{
if ([[NSUserDefaults standardUserDefaults] boolForKey:soundStatus]==YES)
{
[self.audioplayer play];
}
}
-(void)dealloc
{
[audioplayer release];
[super dealloc];
}
@end
i kliknięcia przycisku na dowolnej klasy robię
SoundPlayUtil *obj = [[SoundPlayUtil alloc] initWithDefaultClickSoundName];
[obj playIfSoundisEnabled];
[obj release];
Działa poprawnie i udało mi się odtworzyć dźwięk. Problem powstał, gdy analizowałem kod. Kompilator pokazuje, że występuje przeciek pamięci w metodzie initWithDefaultClickSoundName w .m klasy narzędziowej, ponieważ wysyłam metodę alokacji do self.audioplayer i nie zwalniam jej.
Jakie jest najlepsze miejsce do uwolnienia tego obiektu?
Używasz ARC? –
Nie, nie używając ARC –