Fugas de memoria ARC

Estoy experimentando filtraciones de memoria relacionadas con NSMutableArray en un proyecto configurado para usar ARC, que supuse que debía manejar estas cosas por usted.

El siguiente código está desencadenando fugas de NSNumbers:

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

Al ejecutar la última línea, se muestra lo siguiente en el depurador:

objc [1106]: objeto 0x765ffe0 de la clase __NSCFNumber liberado automáticamente sin agrupación en su lugar – solo goteando – rompe en objc_autoreleaseNoPool () para depurar

Aparte de eso, el objeto parece estar correctamente agregado a la matriz mutable,

¿Estoy haciendo algo obvio equivocado?

Nota: Hay una clase en el proyecto que no pude trabajar con ARC, por lo que la excluí de ARC usando el indicador del comstackdor -fno-objc-arc. Sin embargo, las filtraciones están ocurriendo en otras clases que usan ARC. No estoy seguro si eso está relacionado.

Muchas gracias por su ayuda.

Probablemente estés ejecutando este código en un hilo de fondo, y no tienes un grupo de autorrelease en su lugar. ARC seguirá liberando automáticamente los objetos para usted en ocasiones, y si llama a los marcos Apple, es posible que aún no sean ARC, por lo que definitivamente podrían autorretratar objetos por usted. Por lo tanto, aún necesita un conjunto de autorrelease en su lugar.

Cocoa crea un grupo de autorrelease para usted en el hilo principal, pero no hace nada por usted en los hilos de fondo. Si va a patear algo en un hilo de fondo sin utilizar NSOperation o algo así, querrá enrollar ese hilo en un @autoreleasepool , así:

 - (void)doSomething { [self performSelectorInBackground:@selector(backgroundSomething)]; } - (void)backgroundSomething { @autoreleasepool { NSLog(@"Here I am in the background, doing something."); myArray = [[NSMutableArray alloc] init]; // etc. } } 

Es muy probable que haya definido NSMutableArray como una variable estática. Cuando haces eso, caes fuera de los límites de cualquier grupo de autorrelease, ya que las definiciones estáticas se activan fuera de cualquier runloop. ARC no es mágicamente, simplemente automatiza las llamadas de administración de memoria dentro del marco de retención / liberación existente y por lo tanto no puede ayudar en esos casos.

La solución es inicializar la variable estática en algún lugar de una clase para que su matriz mutable se construya dentro del runloop.