Soy nuevo en el código administrado de memoria pero entiendo bastante bien la idea.Versión C del objetivo C, liberación automática y tipos de datos
Al llevar mi aplicación a través de la herramienta de fugas en XCode, noté que solo tenía que limpiar mis objetos personalizados, pero no las matrices creadas dinámicamente, por ejemplo, así que creí que esos tipos de datos se liberaban automáticamente. Tiene sentido ya que solo para liberar las matrices que utilicé como propiedades que tenían (retener) en ellas.
Entonces me di cuenta de algo extraño: me estaba poniendo una fuga en una cierta gama inicializado como esto:
NSMutableArray *removals = [NSMutableArray new];
pero no una similar
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:9];
Ahora, la razón por la que se haya definido con "nuevo" es que podría tener de 0 a 99 elementos, mientras que el otro que sabía que iba a ser siempre 9. Dado que ambas matrices se pasan al mismo método más adelante en función de la interacción del usuario, o estaba obteniendo una fuga ¡Si no lo liberé al final del método, o una excepción si lo hiciera!
me cambió la primera matriz de
NSMutableArray *removals = [NSMutableArray arrayWithCapacity:99];
y me sale no hay fugas y no tienen nada para liberar. ¿Alguien puede explicar?
** Todos ** de esos métodos devuelven un objeto con un conteo de retención de 1. La diferencia es solo que con algunos posee el objeto y, por lo tanto, es necesario que lo libere, y con los demás no es el propietario. objeto y no están obligados a liberarlo (pero tampoco pueden contar con que esté más allá de la cadena de llamadas actual). – Chuck
Estrictamente hablando, no, no lo hacen, es un detalle de implementación. En varios casos, devuelven cosas con diferentes recuentos de retención. Por ejemplo = [UIImage imageNamed:] puede devolver algo con un retazo grande de retención grande porque podría reutilizar una imagen en caché. –
Bueno, sí, el recuento de retención en sí es un detalle de implementación. Los documentos de Apple dicen tanto. Y en todos los casos que mencionó anteriormente, en las versiones actuales de OS X, el valor de este detalle de implementación es 1. – Chuck