即使我明确地释放它,循环中的NSMutableArray也会泄漏内存

Syn*_*tix 2 macos cocoa objective-c

这个循环泄漏内存:

int64_t i,verylongnumber;

//misc. code

for(i=0;i<verylongnumber;i++){
    NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects:
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            nil];
    [myArray removeAllObjects];
    [myArray release];
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一切,以防止泄漏记忆,但我不能.我认为它与NSNumbers有关.我假设它们是自动释放的,但这是否意味着我必须单独释放它们(即使用alloc)?我怎么会这样做?为每个NSNumber创建一个单独的变量并将其插入到数组中?这似乎很多工作.我尝试了[myArray removeAllObjects],但这并没有什么区别.它在我自己的线程内有自己的自动释放池.我不确定这是否有所作为.

这解决了它:

我在循环中添加了一个额外的自动释放池:

int64_t i,verylongnumber;

//misc. code

for(i=0;i<verylongnumber;i++){

    NSAutoreleasePool *pool2 = [[NSAutoreleasePool alloc] init];

    NSMutableArray *myArray = [[NSMutableArray alloc] initWithObjects:
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            [NSNumber numberWithLongLong:65535],
            nil];
    [myArray release];

    [pool2 drain];
}
Run Code Online (Sandbox Code Playgroud)

Car*_*ter 6

我会捅这个......

您可以删除[myArray removeAllObjects],因为它是多余的.NSArray确实保留了它们的对象,但是当阵列本身被释放时它们也会释放它们.

NSNumbers本身是自动释放的.但是,如果你做一个非常大的循环,那么自动释放的内存实际上不会被释放,直到for循环退出并最终运行循环(除非你在某处设置了一个单独的NSAutoreleasePool).

所以我可以看到当循环迭代时内存使用量会如何增加,但是在完成时它应该释放内存.你是怎么得出你有泄漏的结论的?