ios - ARC 内存泄漏

标签 ios xcode automatic-ref-counting

我在配置为使用 ARC 的项目中遇到与 NSMutableArray 相关的内存泄漏,我认为它应该为您处理这些事情。

以下代码触发了 NSNumbers 的泄漏:

NSMutableArray *myArray = [[NSMutableArray alloc] init];

NSNumber  *myNumber = [NSNumber numberWithFloat:10];

[myArray addObject:myNumber];

运行最后一行在调试器中给出以下内容:

objc[1106]: Object 0x765ffe0 of class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug

除此之外,该对象似乎已正确添加到可变数组中,

我做错了什么吗?

注意:项目中有一个类我无法使用 ARC,因此我使用编译器标志 -fno-objc-arc 将其排除在 ARC 之外。但是,泄漏发生在其他使用 ARC 的类中。不确定这是否相关。

非常感谢您的帮助。

最佳答案

您可能在后台线程上运行此代码,并且没有适当的自动释放池。 ARC 仍会偶尔为您自动释放对象,如果您正在调用 Apple 框架,它们可能仍然是非 ARC,因此它们肯定可以为您自动释放对象。所以你仍然需要一个自动释放池。

Cocoa 在主线程上为您创建一个自动释放池,但在后台线程上不为您做任何事情。如果你打算在不使用 NSOperation 或其他东西的情况下将某些东西踢到后台线程,你需要将该线程包装在 @autoreleasepool 中,如下所示:

- (void)doSomething {
    [self performSelectorInBackground:@selector(backgroundSomething)];
}

- (void)backgroundSomething {
    @autoreleasepool {
        NSLog(@"Here I am in the background, doing something.");
        myArray = [[NSMutableArray alloc] init];
        // etc.
    }
}

关于ios - ARC 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9770213/

相关文章:

ios - 如何在 iOS7 的 UIPopoverController 中禁用深色透明效果?

ios - 真正的随机 Xcode

ios - 为什么在 PresentViewController 处于警报状态后,popViewController 不工作?

ios - 使用 ARC 时无法从一个类调用方法到另一个类

Xcode ARC(自动引用计数), "release is unavailable"

ios - 了解objc中 block 存储管理的一种极端情况

ios - 如何使用 Swift 从 iOS HealthKit 应用读取心率?

swift - 如何在 Pure Playground 文件中获取 CoreML

ios - Xcode + Swift - 如果设备使用的是 iOS 8,则只有某些元素

ios - 以圆形图案拍摄物体 SpriteKit