2009-09-23 25 views
17

Me molesta un poco que algunos objetos sean liberados automáticamente sin que yo lo sepa. Probablemente sea bueno que lo sean, pero si lo son, quiero saber. La documentación no dice qué métodos abren automáticamente los objetos, por lo que generalmente pruebo el camino a seguir, que en mi opinión es una tontería. Por ejemplo, [NSDate date] libera automáticamente el objeto, y también lo hace [NSArray arrayWithObjects: ...]. ¿Cómo lo sabes sin que la documentación te lo diga?¿Cómo saber si un objeto se libera automáticamente o no?

Estoy empezando a ver un patrón, aunque métodos como estos, los que crean objetos con una función estática, siempre devuelve el objeto liberado automáticamente. Es esto siempre cierto?

+0

Creo que quiere decir "método de clase" (en lugar de "método de instancia") en lugar de "función estática". Como se explica a continuación, el +/- no determina si un objeto devuelto se libera automáticamente, es una cuestión de convenciones y reglas simples. La mayoría de los métodos devuelven objetos que debe conservar: los métodos que devuelven un objeto con un conteo retenido de +1 son la excepción en lugar de la regla. –

+0

Método de la clase realmente quise decir. Utilicé "estática" de la terminología de Java y por alguna razón "función", aunque debería haber sido "método". Bueno, todos son iguales en la memoria de todos modos. :) – quano

Respuesta

21

Básicamente, si init, copy, o retain es un objeto, usted es responsable de liberarlo. Si no lo haces, no eres responsable de liberarlo.

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

Muchas clases proporcionan métodos de la forma + className ... que se pueden utilizar para obtener una nueva instancia de la clase. A menudo denominados "conveniencia constructores", estos métodos crean una nueva instancia de la clase, la inicializan y la devuelven para su uso. Aunque pueda pensar que es responsable de liberar los objetos creados de esta manera, que no es el caso de acuerdo con la política de propiedad establecida anteriormente. Debido a que la clase crea el nuevo objeto, es responsable de la eliminación del nuevo objeto .

+0

Esta es una buena respuesta también. – bobobobo

4

La firma del método en sí lo indica. El patrón de métodos con firmas como "classNameWithData: data1: data2" es devolver una instancia de alloc/init/autorelease de esa cosa. Son comodidades allí para que no tengas que hacerlo.

Si no desea una versión de liberación automática de algo, no cree una instancia de esa manera, use el alloc/init adecuado y suéltelo cuando haya terminado. Este método es mucho más explícito y un poco más propenso a errores porque si se lanza una excepción, su bloque de lanzamiento podría perderse, pero ese es el precio que paga por tenerlo de esa manera.

+0

+1. Si no está utilizando alloc/init para obtener un objeto, suponga que se libera automáticamente y que lo maneje adecuadamente. – Abizern

Cuestiones relacionadas