我在配置为使用 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/