Cómo comprobar pérdidas de memoria en iOS con dtrace
Cómo comprobar las pérdidas de memoria en iOS, existen varios métodos para su referencia:
1. Análisis estático
A través del análisis estático podemos obtener lo más preliminar. comprensión Hay algunas irregularidades en el código o hay pérdidas de memoria. Este es nuestro primer paso para detectar pérdidas de memoria. Por supuesto, hay algunas advertencias que no nos importan y que podemos ignorar.
2. Verificar pérdidas de memoria a través de instrumentos
Este método puede localizar aproximadamente dónde tenemos pérdidas de memoria. El método consiste en completar una operación de bucle. Si el crecimiento de la memoria es 0, demuestra que nuestro programa no tiene una pérdida de memoria en la operación del bucle. Si el crecimiento de la memoria no es 0, demuestra que puede haber una pérdida de memoria. Por supuesto, los problemas específicos requieren un análisis detallado.
3. Pérdidas de memoria de prueba de código
Antes de realizar este trabajo, debemos prestar atención a si hemos liberado todos los objetos que pertenecen al objeto en el método dealloc. Observe si la creación y destrucción de objetos están emparejadas. Para ser precisos, se trata de si init (el método para crear un objeto) y dealloc se activarán en pares (en pocas palabras, una vez que se crea un objeto, habrá un paso para desasignar el objeto).
Las siguientes son algunas de las situaciones más sutiles que causan pérdidas de memoria que he encontrado:
1. Dos objetos se poseen entre sí: es decir, el objeto a retiene/addSubview. objeto b., el objeto b también retiene/addSubView el objeto a. Nota: No utilice el atributo de retención para delegar. El uso del atributo de asignación también generará propiedad mutua.
2. A veces es necesario usar removeFromSuperView para liberar: Específicamente, tal vez mi objeto a posee un objeto b, y el objeto b se agrega al objeto c, y en nuestro diseño el ciclo de vida de b. el objeto debe ser el mismo que el objeto a en este momento, solo que [b
release]/self.b
nil no puede liberar el objeto b; (generalmente, en este caso, la liberación hará que retengaCount-1, y [super
dealloc] retendráCount-1 de todas las subVistas nuevamente, y b no es la subVista de a, por lo que todo el último -1 ya no está), por lo que debemos agregar [b
removeFromSuperView] antes.