我在一个配置为使用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. } }