C++ 如何修复objective-c代码中的内存泄漏问题?
我正在尝试与iOS硬件通信,以确定设备是否使用内置扬声器。这一切都很好,但每当我使用这段代码时,就会出现内存泄漏。我把它放在Objy+C++的.mm文件中,从C++代码中调用它。这是我第一次尝试使用objective-c,所以我很难确定泄漏可能来自哪里。我甚至不知道这段代码是否有问题,我从堆栈溢出或iosapi中稍微修改了这段代码?这段代码也经常被调用 根据我对objective-c的了解,我曾尝试释放函数中的一些对象,但当音频驱动程序更改设置(采样率等)并导致崩溃时,这会导致问题C++ 如何修复objective-c代码中的内存泄漏问题?,c++,objective-c,memory-management,memory-leaks,objective-c++,C++,Objective C,Memory Management,Memory Leaks,Objective C++,我正在尝试与iOS硬件通信,以确定设备是否使用内置扬声器。这一切都很好,但每当我使用这段代码时,就会出现内存泄漏。我把它放在Objy+C++的.mm文件中,从C++代码中调用它。这是我第一次尝试使用objective-c,所以我很难确定泄漏可能来自哪里。我甚至不知道这段代码是否有问题,我从堆栈溢出或iosapi中稍微修改了这段代码?这段代码也经常被调用 根据我对objective-c的了解,我曾尝试释放函数中的一些对象,但当音频驱动程序更改设置(采样率等)并导致崩溃时,这会导致问题 bool H
bool Headphones::isHeadsetPluggedIn() {
AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
for (AVAudioSessionPortDescription* desc in [route outputs]) {
if ([[desc portType] isEqualToString:AVAudioSessionPortBuiltInSpeaker])
{
return NO;
}
}
return YES;
}
AVAudioSessionRouteDescription* route = [[AVAudioSession sharedInstance] currentRoute];
将不得不写为相当尴尬的
AVAudioSession* session = [AVAudioSession sharedInstance];
AVAudioSessionRouteDescription* route = [session currentRoute];
[session release];
因此,自动释放。这意味着返回的对象将被保留,但会放在当前的自动释放池中。这本质上是一个对象指针堆栈,稍后将成批发布。批次由@autoreleasepool
块描述。在Objective-C代码中,为了避免内存膨胀,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;
}
}
这意味着在执行此函数期间标记为自动释放的任何对象将在返回时释放
我想这会解决你的问题