ARC内存泄漏

我正在遇到与configuration为使用ARC的项目中的NSMutableArray相关的内存泄漏,我认为这是为您处理这些事情。

下面的代码触发NSNumbers的泄漏:

NSMutableArray *myArray = [[NSMutableArray alloc] init]; NSNumber *myNumber = [NSNumber numberWithFloat:10]; [myArray addObject:myNumber]; 

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

objc [1106]:类__NSCFNumber的对象0x765ffe0 autoreleased没有到位的池 – 只是泄漏 – 打破objc_autoreleaseNoPool()debugging

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

我做了什么明显的错误?

注意:项目中有一个类不能与ARC一起工作,所以我使用编译器标志-fno-objc-arc将它从ARC中排除。 但是,在使用ARC的其他类中也发生了泄漏。 不知道这是否相关。

非常感谢您的帮助。

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

Cocoa在主线程上为你创build一个自动释放池,但是在后台线程上不会为你做任何事情。 如果你打算在不使用NSOperation或者其他东西的情况下把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. } } 

很可能你已经将NSMutableArray定义为一个静态variables。 当你这样做的时候,你会落在任何autorelease池的范围之外,因为静态定义在任何runloop之外被激活。 ARC不是神奇的,它只是在现有的保留/释放框架框架内自动执行内存pipe理调用,因此在这些情况下无法提供帮助。

解决的办法是在类中的某个地方初始化静态variables,以便在runloop中构build可变数组。