2009-02-25 11 views
5

Si tengo una NSMutableString comoNSMutableString y nula para la gestión de la memoria

NSMutableString *foo = [[NSMutableString alloc] init]; 

si NIL a cabo el objeto, foo = nil, hace que la más baja es la cuenta de retención por 1, así efectivamente la liberación de la memoria? ¿Tendría que reasignar a foo del montón en este punto para poder usarlo?

Respuesta

8

Por favor, lea the basic documentation. Establecer una variable foo en nil no tiene nada que ver con su contenido anterior. Recuerde, foo es solo un puntero a un objeto; para usarlo, debes hacer que apunte a un objeto válido. Solo para hacer que no apunte a ese objeto, más no libera el objeto.

+1

OP puede estar confundiendo variables con propiedades: si foo fuera una propiedad (no una variable), establecer obj.foo = nil, liberaría el recuento de referencia. –

2
¿eso reduce el conteo de retención en 1, liberando efectivamente la memoria?

Sin

Debe utilizar

[foo release] 
0

foo = nil; no va a bajar la cuenta de retención del objeto. Simplemente hará que foo apunte a ninguna parte en lugar de al objeto. Para disminuir el conteo retenido, tendrá que decir [foo release];.

5

La asignación de nil a una variable no afecta el valor que estaba allí anteriormente. Los recuentos de retención solo se reducen en release.

Debería leer el Cocoa memory management guidelines de Apple. El sistema de recuento de referencias de Cocoa no es tan difícil, pero es algo que debes aprender, y si no lo aprendes correctamente, tu programa tendrá muchos errores sutiles que te volverán loco.

4

Lo que todos dijeron arriba es absolutamente cierto. Necesitas una versión en ese fragmento de código.

Sin embargo, es importante tener en cuenta que la asignación a una propiedad bajará la cuenta de retención si eso es lo que hay que hacer. Es decir:

foo = nil;   // doesn't lower 
bar.foo = nil;  // probably does 

Propiedades parecen a las variables comunes, pero que en realidad no lo son; manejan su propia gestión de memoria de forma inteligente. Eso es algo a tener en cuenta cuando trabajas con ellos.

+0

"Las propiedades ... manejan su propia gestión de memoria de forma inteligente." Suponiendo que las declaras correctamente, por supuesto. Si lo declaras con @property (assign), no se lanzará. –

+0

Esto es cierto, pero se supone que si declara una propiedad con (assign), realmente no debería retenerse (porque es un delegado, por ejemplo). En general, debe suponer que las propiedades de otra clase gestionan correctamente la memoria de sus valores. –

Cuestiones relacionadas