gpt4 book ai didi

c++ - 如何修复 Objective-C 代码中的内存泄漏问题?

转载 作者:行者123 更新时间:2023-11-30 04:46:52 38 4
gpt4 key购买 nike

我正在尝试与 iOS 硬件通信,以确定设备是否正在使用内置扬声器。一切正常,但每当我使用这段代码时,我都会发生内存泄漏。我通过将其放入 objective-c++ 的 .mm 文件中,从我的 C++ 代码中调用它。这是我第一次尝试使用 objective-c,所以我正在努力查看泄漏可能来自何处。我什至不知道我从堆栈溢出或 iOS API 中稍微调整过的这段代码是否有问题?此代码也被非常频繁地调用。

根据我对 objective-c 的了解,我尝试释放函数中的一些对象,但是当音频驱动程序更改设置(采样率等)并导致崩溃时,这会导致问题。

bool Headphones::isHeadsetPluggedIn() {
AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
for (AVAudioSessionPortDescription* desc in [route outputs]) {
if ([[desc portType] isEqualToString:AVAudioSessionPortBuiltInSpeaker])
{
return NO;
}
}
return YES;
}

最佳答案

  1. ARC.

来自

I have tried to release some of the objects within the function

我推断您在 Objective-C++ 编译单元中禁用了 ARC(自动引用计数)。除非你有充分的理由,否则这可能不是一个好主意,因为 ARC 大大降低了泄漏的可能性。我认为这不是您问题的根源,因为乍一看我无法发现任何可能返回保留对象的方法。

  1. 自动释放

您的代码调用的大量 Objective-C 方法具有标记或推导为自动释放的返回类型。这解决了没有 ARC 的问题,保留返回的对象将意味着调用者不能简单地在另一个表达式中使用方法调用表达式,但总是必须将结果分配给变量以便能够随后释放它,而不保留它可能会导致释放后使用的情况。例如,

    AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];

必须写成相当尴尬的

    AVAudioSession* session = [AVAudioSession sharedInstance];
AVAudioSessionRouteDescription* route = [session currentRoute];
[session release];

因此,自动释放。这意味着返回的对象保留但放置在当前的自动释放中。这本质上是一堆对象指针,稍后会被批量释放。批处理由 @autoreleasepool block 描述。在 Objective-C 代码中,you usually only need to place these blocks explicitly in loops which operate on very large or very many objects为了避免内存使用膨胀,但 runloop 和其他事件源隐式创建了一个池,该池在事件处理程序返回时被清除。

由于您的代码主要是 C++,我怀疑您没有足够频繁地使用这种隐式池,尤其是在您使用传统游戏循环的情况下。解决方案是将您的函数包装在一个池中:

bool Headphones::isHeadsetPluggedIn() {
@autoreleasepool
{
AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
for (AVAudioSessionPortDescription* desc in [route outputs]) {
if ([[desc portType] isEqualToString:AVAudioSessionPortBuiltInSpeaker])
{
return NO;
}
}
return YES;
}
}

这意味着在执行此函数期间标记为自动释放的任何对象都将在返回时释放。

我想这会解决您的问题。

关于c++ - 如何修复 Objective-C 代码中的内存泄漏问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56491061/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com