recomendada para memoria funciona configurar como calcular aumentar 8gb 4gb 16gb objective-c crash uiimage virtual-memory

objective c - para - Aplicación de iOS Se bloquea al cargar UIImage(la memoria virtual no se limpia)



memoria virtual recomendada para 8gb ram (2)

Tengo un bloqueo extraño en mi aplicación sin ningún rastro. este es probablemente un problema relacionado con la memoria, pero con muy poca información y no estoy seguro de cómo proceder o solucionarlo. Si no fuera por los instrumentos, no se habría dado ninguna pista de qué se trata.

Tengo una matriz de imágenes (en este ejemplo una matriz de tamaño 2) donde cargo una imagen, creo un contexto de imagen y dibujo y lo guardo en la matriz. Cada vez que se llama al método, los objetos de matriz de imagen se reemplazan por el contenido nuevo. En los instrumentos veo un uso muy grande de la memoria virtual durante esta llamada al método y, aparentemente, después de que cada memoria de la llamada no se borra y, por lo tanto, se bloquea. El proyecto es ARC. Voy a listar el código abajo. Esto es todo lo que necesitamos para recrear este problema. (La imagen que estoy usando tiene un tamaño pequeño de aproximadamente 7 MB, por lo que es más fácil recrear el bloqueo). También estoy usando el dispositivo iPad2.

+ (UIImage *)imageCopy:(UIImage *)src { UIGraphicsBeginImageContext(src.size); [src drawAtPoint:CGPointZero]; UIImage *r = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return r; } - (IBAction)buttonTouch:(id)sender { for (int i=0; i<2; i++) { if (i==0) { self.mImage = [UIImage imageNamed:@"LARGE_elevation.jpg"]; } else { self.mImage = [UIImage imageNamed:@"LARGE_elevation2.jpg"]; } // imageArray is a NSMutableArray with capacity of 2 [imageArray setObject:[ViewController imageCopy:self.mImage] atIndexedSubscript:i]; } ((UIImageView *)[self.view viewWithTag:100]).image = self.mImage; }

Aquí hay una pantalla de instrumentos donde se cuelga la segunda vez después de que se emiten las advertencias de memoria.

No veo ningún gran problema con el método "imageCopy" que estoy usando aquí.

Cualquier ayuda sobre esto es realmente apreciada. Gracias y Saludos,


Descubrí que era un tema de referencia cíclico . Entonces, cuando el contenido nuevo reemplaza el contenido anterior en la matriz, los objetos pasados ​​aún permanecen. Fue un hallazgo bastante interesante porque en el analizador de pérdidas de memoria aparecía una fuga de datos de KB que no sospecharía, ya que la memoria virtual no liberada era de unos pocos cientos de megabytes (MB).

Como un ejemplo muy abstracto.

ClassA @property (strong) ClassB *obj ---------- ClassB @property (strong) ClassA *obj - (id)initWithA:(ClassA *)objA; ----------

Entonces cuando elimines A ninguno de los objetos será desasignado apropiadamente. En mi caso, la fuga rastreada por el analizador de fugas fue de pocos KB para ambos objetos, a pesar de que los cálculos de CoreGraphics se basaban en datos de 200 MB en la memoria virtual.

La solución era marcar la referencia A en ClaseB como débil.

ClassB @property (weak) ClassA *obj - (id)initWithA:(ClassA *)objA;

Veredicto

  • Nunca menosprecie una fuga de memoria, no importa cuán grande o pequeña sea y de arco o mrc

El problema probablemente sea que el método imageNamed: almacena en caché las imágenes cargadas, y aparentemente no hay forma de borrar la memoria caché después de una advertencia de memoria programáticamente.
En lugar de imageNamed: puede usar otros métodos como initWithData: que no almacenan en caché las imágenes. Encontrará una discusión detallada aquí .