retainCount muestra MaxInt

Después de intentar imprimir retainCount del object obtengo 2147483647. ¿Por qué obtengo un resultado así? Debería ser 1, ¿no debería?

NSString *myStr = [NSString new]; NSUInteger retCount = [myStr retainCount]; NSLog(@"refCount = %u", retCount); 

Prueba de testing de 2011-09-08 17: 59: 18.759 [51972: 207] refCount = 2147483647

Yo uso XCode versión 4.1. Los comstackdores probados GCC 4.2 y LLVM GCC 4.2 – el mismo resultado. La opción Recolección de basura se configuró como no admitida.

NSString es algo especial cuando se trata de gestión de memory. Los literales de cadena (algo así como @"foo" ) son singletons efectivos, cada cadena con el mismo contenido es el mismo object porque no se puede modificar de todos modos. Como [NSString new] siempre crea una cadena vacía que no se puede modificar, siempre obtendrá la misma instancia que no se puede liberar (por lo tanto, high retainCount ).

Prueba este fragment:

 NSString *string1 = [NSString new]; NSString *string2 = [NSString new]; NSLog(@"Memory address of string1: %p", string1); NSLog(@"Memory address of string2: %p", string2); 

Verá que ambas cadenas tienen la misma dirección de memory y, por lo tanto, son el mismo object.

Esto no responde directamente a su pregunta, pero retenerCount no es realmente tan útil y no debe usarse para las testings. Mira esta publicación SO para más detalles. ¿Cuándo usar -retainCount?

Si bien NSString es un caso extraño (hay otros en el marco), es posible que también se ejecute en otras classs; es una de las forms de crear un object singleton.

Un singleton solo existe una vez en la aplicación y es muy importante que nunca se publique. Por lo tanto, sobrescribirá algunos methods de NSObject, incluidos (entre otros):

 - (id)release { // Ignore the release! return self; } - (NSUInteger)retainCount { // We are never going to be released return UINT_MAX; } 

Este object nunca se puede liberar y le dice al marco que es un singleton al tener un recuento de retención ridículamente alto.

Consulte este enlace para get más información sobre los objects singleton.

He visto esto un par de veces con respecto a NSStrings, retenerCount devuelve el recuento máximo en lugar de uno real cuando intenta mirar retener counts de cadenas de esta manera.

Prueba esto;

 NSString *myStr = [[NSString alloc] init]; NSUInteger retCount = [myStr retainCount]; NSLog(@"refCount = %u", retCount); 

Edit: Restaurado NSUInteger