我的程序有内存泄漏

时间:2011-11-08 18:27:28

标签: iphone ios4 memory memory-leaks memory-management

-(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

5 个答案:

答案 0 :(得分:2)

AudioServicesCreateSystemSoundID(soundFileURLRef,& soundID); - 泄漏到这里,因为创建添加以保留计数

播放声音后使用AudioServicesDisposeSystemSoundID

答案 1 :(得分:2)

CFBundleCopyResourceURL包含副本,因此soundFileURLRef上的保留计数实际为1.完成后,请致电CFRelease(soundFileURLRef)以减少保留计数。

除了您收到的错误之外,SAKrisT关于使用AudioServicesDisposeSystemSoundID在您创建的对象上调用AudioServicesCreateSystemSoundID的答案也是可以解决的问题。

答案 2 :(得分:2)

CFBundleCopyResourceURL创建您拥有的CFURLRef对象 ,因此您需要在CFRelease的某个时间点放弃此对象的所有权。同样,您需要平衡对AudioServicesCreateSystemSoundID的通话和另一个AudioServicesDisposeSystemSoundID的通话。

对于Core Foundation,在其名称中包含单词CreateCopy的函数将返回您拥有的对象,因此您必须在完成它后放弃对它的所有权。有关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对象,但是由于内存长时间未使用,它仍会显示内存泄漏。
因此,首先你通过[警报显示]显示警报,然后你需要该物体,所以通过[警告释放]释放它;
享受!! :)