Respuesta

20

La tarea es solo eso. El puntero string es básicamente una etiqueta que apunta a una dirección específica en la memoria. ¡La declaración de reasignación señalaría esa etiqueta a otra dirección en la memoria!

No cambia el recuento de referencias ni hace nada más que eso en Objective-C. Es necesario mantener el recuento de referencia a sí mismo, si está ejecutando en un entorno no-recolección de basura:

[string release]; 
string = [@"Some text" retain]; 

Sin embargo, los literales de cadena no necesitan ser administrados, a medida que se asignan estáticamente y nunca se desasignado ! Entonces, los métodos release y retain son solo NOOP (es decir, no hay operaciones). Puedes omitirlos con seguridad.

+0

Gracias! Eso es lo que esperaba con respecto a la asignación del puntero ... ... Aah, entonces el "-1" retiene el recuento después de la asignación (es decir, [string retainCount]) es un indicador que indica que "cadena" apunta a un literal de cadena que por lo tanto, no necesita ser administrado, ¿pero puede ser liberado de manera segura? – notMyScreenName

+5

El "conteo de retención" de -1 después de la asignación indica que nunca debe prestar atención al conteo absoluto de retención de ningún objeto. Si lo conservas, debes liberarlo. Eso es todo. Ese @ "" strings no necesita retener/liberar es un detalle de implementación que, técnicamente, no se debe confiar. Sin embargo, todos lo hacen y todo se rompería si la implementación cambiara. – bbum

0

Cuando utiliza un literal como en este caso, es simplemente azúcar sintáctico para crear rápidamente un objeto NSString. Una vez creado, el objeto se comporta como cualquier otro. La diferencia aquí es que su cadena se compila en el programa en lugar de crearse dinámicamente.

2

¿Qué significa realmente la siguiente línea?

string = @"Some text"; 

Suponiendo que "cadena" se declara thusly en la cabecera:

NSString *string; 

¿Qué significa el "=" en realidad lo hacen aquí? ¿Qué hace al recuento de referencias de "cuerdas"?

string no es una cadena.

string es, de hecho, ningún otro tipo de objeto de cacao, tampoco.

es una variable que ha creado para contener una instancia de NSString. El operador de asignación pone algo en una variable *. En su ejemplo anterior, crea una cadena literal y la coloca en la variable.

Dado que string es un objeto variable, no un objeto Cocoa, no tiene recuento de referencias.

Asignar un objeto en algún lugar puede prolongar la duración del objeto en código recogido de basura (solo en Mac). Ver the Memory Management Programming Guide for Cocoa para más detalles.

* O una matriz C. No confundas estos con arreglos de Cacao; no son intercambiables, y no puede usar el operador de asignación para poner cosas en una colección de Cocoa (no en Objective-C, de todos modos).

Cuestiones relacionadas