Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 我的程序内存泄漏_Iphone_Ios4_Memory_Memory Leaks_Memory Management - Fatal编程技术网

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);
}