-(IBAction)play2;
{
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef soundFileURLRef;
soundFileURLRef =CFBundleCopyResourceURL(mainBundle,
(CFStringRef) @"Bear3", CFSTR ("wav"), NULL);
UInt32 soundID;
AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
AudioServicesPlaySystemSound(soundID);
}
这给了我一个错误:
potential leak of an object allocated " CFBundleResourceURL
returns a Core Foundation object with a +1 retain count
答案 0 :(得分:2)
AudioServicesCreateSystemSoundID(soundFileURLRef,& soundID); - 泄漏到这里,因为创建添加以保留计数
答案 1 :(得分:2)
CFBundleCopyResourceURL
包含副本,因此soundFileURLRef
上的保留计数实际为1.完成后,请致电CFRelease(soundFileURLRef)
以减少保留计数。
除了您收到的错误之外,SAKrisT关于使用AudioServicesDisposeSystemSoundID
在您创建的对象上调用AudioServicesCreateSystemSoundID
的答案也是可以解决的问题。
答案 2 :(得分:2)
CFBundleCopyResourceURL
创建您拥有的CFURLRef
对象 ,因此您需要在CFRelease
的某个时间点放弃此对象的所有权。同样,您需要平衡对AudioServicesCreateSystemSoundID
的通话和另一个AudioServicesDisposeSystemSoundID
的通话。
对于Core Foundation,在其名称中包含单词Create
或Copy
的函数将返回您拥有的对象,因此您必须在完成它后放弃对它的所有权。有关Core Foundation内存管理的更多信息,请参阅Core Foundation Memory Management Programming Guide。
只是给你一个提示,我可能会像这样处理内存管理(虽然我还没有编写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);
}
答案 3 :(得分:1)
如果您没有使用ARC(xcode 4.2中提供),则需要释放您分配的任何内容。在[alert release]
之后添加[alert show]
。
答案 4 :(得分:-1)
每当使用关键字“alloc”时,就意味着您要为对象分配一些内存空间。现在,如果您不自行释放或自动释放它,那么它会显示“内存泄漏”。它不仅仅是关于uialertview,也适用于其他所有物体。
您可能希望在dealloc()方法中释放alertview对象,但是由于内存长时间未使用,它仍会显示内存泄漏。
因此,首先你通过[警报显示]显示警报,然后你需要该物体,所以通过[警告释放]释放它;
享受!! :)