我在配置为使用ARC的项目中遇到与NSMutableArray链接的内存泄漏,我认为应该为您处理这些事情。
以下代码触发了NSNumbers的泄漏:
NSMutableArray *myArray = [[NSMutableArray alloc] init];
NSNumber *myNumber = [NSNumber numberWithFloat:10];
[myArray addObject:myNumber];
运行最后一行在调试器中提供以下内容:
objc [1106]:类__NSCFNumber的对象0x765ffe0自动释放,没有池到位 - 只是泄漏 - 在objc_autoreleaseNoPool()中断以进行调试
除此之外,该对象似乎已正确添加到可变数组中,
我做错了吗?
注意:项目中有一个类无法使用ARC,因此我使用编译器标志-fno-objc-arc将其从ARC中排除。但是,泄漏发生在使用ARC的其他类中。不确定是否相关。
非常感谢你的帮助。
答案 0 :(得分:39)
您可能在后台线程上运行此代码,并且没有自动释放池。 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.
}
}
答案 1 :(得分:-2)
很可能您已将NSMutableArray定义为静态变量。当你这样做时,你超出了任何自动释放池的范围,因为静态定义是在任何runloop之外激活的。 ARC不是神奇的,它只是在现有保留/发布框架的框架内自动执行内存管理调用,因此在这些情况下无法提供帮助。
解决方案是在类的某处初始化静态变量,以便在runloop中构建可变数组。