ARC内存泄漏

时间:2012-03-19 12:29:01

标签: ios xcode automatic-ref-counting

我在配置为使用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的其他类中。不确定是否相关。

非常感谢你的帮助。

2 个答案:

答案 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中构建可变数组。