有人可以告诉我为什么会泄漏吗?我正在使用CFRelease(),我认为它会发布CFURLRef soundFileURLRef

调用函数“CFBridgingRetain”返回保留计数为+1的Core Foundation对象
对象泄漏:此执行路径中稍后将不引用分配的对象,并且保留计数为+1

  -(void) playGuitarNote:(NSString *)noteVal {

    AudioServicesDisposeSystemSoundID(soundId);
    CFBundleRef mainBundle = CFBundleGetMainBundle();
    CFURLRef soundFileURLRef = CFBundleCopyResourceURL(mainBundle,CFBridgingRetain(noteVal), CFSTR("aiff"), NULL);
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundId);
    AudioServicesPlaySystemSound(soundId);
    CFRelease(soundFileURLRef);
    noteVal = nil;

}

最佳答案

您不应该在那里 call CFBridgingRetain()。您应该只使用__bridge强制转换:

CFURLRef soundFileURLRef = CFBundleCopyResourceURL(mainBundle,(__bridge CFStringRef)noteVal, CFSTR("aiff"), NULL);

您无需更改noteVal的所有权,而只是传递它,并告诉编译器将其视为不同(但兼容)的类型。

关于objective-c - CFBridgingRetain的静态分析器泄漏警告,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14805100/

10-12 16:06