Iphone 我的程序内存泄漏
这给了我一个错误:Iphone 我的程序内存泄漏,iphone,ios4,memory,memory-leaks,memory-management,Iphone,Ios4,Memory,Memory Leaks,Memory Management,这给了我一个错误: -(IBAction)play2; { CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef soundFileURLRef; soundFileURLRef =CFBundleCopyResourceURL(mainBundle, (CFStringRef) @"Bear3", CFSTR ("
-(IBAction)play2;
{
CFBundleRef mainBundle = CFBundleGetMainBundle();
CFURLRef soundFileURLRef;
soundFileURLRef =CFBundleCopyResourceURL(mainBundle,
(CFStringRef) @"Bear3", CFSTR ("wav"), NULL);
UInt32 soundID;
AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID);
AudioServicesPlaySystemSound(soundID);
}
(soundFileURLRef和soundID);-此处泄漏,因为创建添加了保留计数
播放声音后使用
CbundlecopyresourceUrl
包含副本,因此您在soundFileURLRef
上的保留计数实际上是1。完成后,请调用CFRelease(soundFileURLRef)
以减少保留计数
除了您遇到的错误之外,SAKrisT关于在您使用
AudioServicesCreateSystemSoundID
创建的对象上调用AudioServicesDisposeSystemSoundID
的回答也需要解决。CbundlecopyResource
创建了一个您自己的CFURLRef
对象,因此,您需要在某个时候使用CFRelease
放弃此对象的所有权。同样,您需要平衡对AudioServicesCreateSystemSoundID
的调用和对AudioServicesDisposeSystemSoundID
的另一个调用
对于核心基础,具有单词<代码>创建或<代码>拷贝<代码>的函数以自己的名字返回一个你自己拥有的对象,所以当你完成它时,必须放弃它的所有权。有关核心基础内存管理的更多信息,请参见.
只是给你一个提示,我可能会像这样处理内存管理(尽管我已经有一段时间没有编写Objective-C了)。这还假设您出于任何原因希望保留URL引用:potential leak of an object allocated " CFBundleResourceURL
returns a Core Foundation object with a +1 retain count
如果您没有使用ARC(在xcode 4.2中提供),那么您需要释放您分配的任何内容。在
[alert show]
之后添加[alert release]
,无论何时使用关键字“alloc”,都意味着您正在为对象分配一些内存空间。现在,如果您不自己释放它或自动释放它,那么它会显示“内存泄漏”。它不仅涉及uialertview,还涉及其他所有对象您可能希望在dealloc()方法中释放alertview对象,但它仍然会显示内存泄漏,因为内存长时间未使用
因此,首先通过[alert show]显示警报,然后再需要该对象,因此通过[alert release]释放它
享受!!:) 避免讨论对象的实际保留计数(严格说来,这是一个实现细节),而是从所有权的角度考虑对象。@dreamlax我讨论保留计数是因为错误中提到了这个问题。请仔细阅读错误,它不会告诉您实际保留计数,就您的所有权而言,只是相对保留计数。在我释放后,声音将不再播放。当您不再需要它时,即当您的类正在释放时,释放它。将
soundFileURLRef
和soundID
都设置为实例变量,然后在对象的dealloc
方法中,放置CFRelease(soundFileURLRef);AudioServicesDisposeSystemSoundID(soundID)代码>。(可能没有必要将URL对象设置为实例变量)这些实例变量是如何设置的?我对编码很陌生,所以我不知道much@alfred:我已经编辑了我的答案,希望这能澄清一些事情。-1:他不能在dealloc中发布,因为范围在pushAbout函数中。这并不是说它显示内存泄漏-这是一个内存泄漏-它不会显示为泄漏,如果它被闲置了很长时间,但最终释放。请重新阅读《内存管理指南》。
@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);
}