Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.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
C++ 如何修复objective-c代码中的内存泄漏问题?_C++_Objective C_Memory Management_Memory Leaks_Objective C++ - Fatal编程技术网

C++ 如何修复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

我正在尝试与iOS硬件通信,以确定设备是否使用内置扬声器。这一切都很好,但每当我使用这段代码时,就会出现内存泄漏。我把它放在Objy+C++的.mm文件中,从C++代码中调用它。这是我第一次尝试使用objective-c,所以我很难确定泄漏可能来自哪里。我甚至不知道这段代码是否有问题,我从堆栈溢出或iosapi中稍微修改了这段代码?这段代码也经常被调用

根据我对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;
}
  • 弧。
  • 我试图释放函数中的一些对象

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

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

        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;
        }
    }
    
    这意味着在执行此函数期间标记为自动释放的任何对象将在返回时释放

    我想这会解决你的问题