CFBundleCopyResourceURL
создает CFURLRef
объект , которым вы владеете , поэтому вам нужно в какой-то момент отказаться от владения этим объектом с помощью CFRelease
.Точно так же вам нужно будет сбалансировать ваш вызов на AudioServicesCreateSystemSoundID
с другим вызовом на AudioServicesDisposeSystemSoundID
.
. Для Базовой Основы функции, в названии которых содержится слово Create
или Copy
, возвращают объект, который вывладеть, поэтому вы должны отказаться от владения им, когда вы закончите с ним.Для получения дополнительной информации об управлении памятью Core Foundation см. Руководство по программированию управления памятью Core Foundation *1013*.
Просто, чтобы дать вам подсказку, я бы, вероятно, справился с управлением памятью следующим образом (хотя у меня нетнекоторое время не кодировал Objective-C).Это также предполагает, что вы хотите сохранить ссылку на URL по любой причине:
@interface MyClass
{
CFURLRef soundFileURLRef;
UInt32 soundID;
}
@end
@implementation MyClass
- (id) init
{
self = [super init];
if (!self) return nil;
CFBundleRef mainBundle = CFBundleGetMainBundle();
soundFileURLRef = CFBundleCopyResourceURL(mainBundle, CFSTR("Bear3"), CFSTR("wav"));
AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
return self;
}
- (void) dealloc
{
AudioServicesDisposeSystemSoundID(soundID);
CFRelease(soundFileURLRef);
[super dealloc];
}
- (IBAction) play2
{
AudioServicesPlaySystemSound(soundID);
}