NSString retiene el conteo

Hace solo un par de días que estaba trabajando en un proyecto y tengo que ver cuál es el conteo retenido de una cadena.

Pero siempre me devuelve “2147483647”, ¿Por qué es así?

Vea este código para verificarlo usted mismo.

NSString *str = [[NSString alloc] initWithString:@"Hello World"]; NSLog(@"String Retain Count: %i", [str retainCount]); 

Así que mi pregunta es por qué no está regresando 1, como otros objetos regresan, por qué me estoy poniendo “2147483647”

Gracias por adelantado.

El comstackdor es más inteligente que tú.

Ve @"Hello world" y piensa “¡Ajá! ¡Una cuerda constante!”

Luego ve [[NSString alloc] initWithString:@"Hello world!"] Y piensa “¡Aja !, ¡un objeto inmutable creado con una cuerda constante!”

A continuación, ambos colapsan en una única NSConstantString , que tiene una retainCount de UINT_MAX , por lo que nunca se puede liberar.

 NSString *str = [[NSString alloc] initXXX 

por lo general, asignaría algo de RAM y le devolverá un puntero. Esta RAM estaría entonces sujeta a liberaciones y renacimientos. Sin embargo, cuando lo haces:

 NSString *str = [[NSString alloc] initWithString:@"Hello World"]; 

la cadena devuelta es @ “Hello World”, que ya está asignada porque era una cadena literal. Como es un literal de cadena, no hay forma de liberarlo y, por lo tanto, el sistema tiene que marcarlo como no recuperable. La forma en que lo hace es establecer su conteo de retención en el valor entero máximo.

 NString *str = [[NSString alloc] initWithFormat:@"Hello World. Today is @%", todayDate]; 

Esta cadena tendrá una retenciónCuenta de 1. Aunque hay una constante de cadena allí, se agrega a otra cadena. Como no puede modificar esa cadena constante, se realiza una copia de la cadena “Hello World.” Y se agrega el contenido de la cadena todayDate. Esa memoria ahora se le otorga la propiedad a la persona que llama, con una retenciónCount de 1.

La cadena se está optimizando en tiempo de comstackción a una instancia asignada estáticamente de NSString para ahorrar en alguna sobrecarga variable y similares. Estás viendo un recuento de retención tan alto porque las cadenas estáticas tienen un conteo retenido del entero máximo en cualquier plataforma en la que estés desarrollando.