Detectando la memoria disponible de un iPhone

¿Es posible detectar la memoria disponible de un iPhone para que cuando se ejecute su aplicación pueda recordarle al usuario que reinicie, dependiendo de si la memoria es baja?

preguntado el 09 de enero de 11 a las 03:01

Buen trabajo, no escriben software para el AirBus 380 de esa manera .... -

3 Respuestas

¿Por qué querrías obligar al usuario a reiniciar su teléfono? esa es una idea terrible. Si la memoria del dispositivo está llena cuando su aplicación intenta asignar algo, el sistema operativo descargará otras aplicaciones de la memoria hasta que los suyos y los servicios esenciales sean todo lo que quede. Y luego recibirás una advertencia de memoria. En ese momento, solo se están ejecutando su aplicación y los servicios esenciales. Reiniciar el dispositivo no solucionará esto.

Respondido el 09 de enero de 11 a las 06:01

Fresco. No quería forzar uno. Pensé que solo se podría mostrar un mensaje recordatorio. - some_id

Esto no coincide con mi experiencia: o estoy asignando memoria más rápido de lo que el sistema operativo puede liberarla, o hay algo más incorrecto, pero mi aplicación puede consumir más de 20 MB después de reiniciar, pero de lo contrario, el sistema operativo la termina mucho antes, advertencias de memoria o no. - Nicholas MT Elliott

Si está llegando a ese escenario, es probable que tenga una fuga. Debe ejecutar una herramienta para fugas y taparlos. - BadPirate

En el iPhone, su vista recibirá -(void) UIViewController:didReceiveMemoryWarning, si se está quedando sin memoria, lo que le dará la oportunidad de purgar cualquier caché necesario para liberar más memoria para su aplicación. Probablemente sea mejor hacerlo en lugar de negarse a iniciar si no hay suficiente memoria disponible a priori. En realidad, detectar la cantidad de memoria disponible sería complicado, porque aunque es posible que pueda obtener la cantidad máxima de memoria que su proceso puede asignar, parte de esa memoria será utilizada por malloc y por el marco de la aplicación.

PD. Obligar a los usuarios a reiniciar es una experiencia de usuario horrible, y su aplicación se cerrará automáticamente si se queda sin memoria, por lo que no hay una buena razón para obligar a los usuarios a reiniciar.

Respondido el 09 de enero de 11 a las 06:01

Espere - "su aplicación se terminará automáticamente si se queda sin memoria" y "no hay una buena razón para obligar a los usuarios a reiniciar" parecen directamente contradictorios ... - Nicholas MT Elliott

No estoy muy seguro de qué memoria está buscando: RAM o disco. Pero el siguiente código debería ayudarlo a obtener lo que está buscando. Ignore NSString * como valores de retorno. Estaban pensados ​​para una fácil impresión.

- (NSString*) totalMemory
{
    NSString* v;
    v = [NSString stringWithFormat:@"%d", [[UIDevice currentDevice] totalMemory]];
    return v;
}


- (NSString*) userMemory
{
    NSString* value;
    value = [NSString stringWithFormat:@"%d", [[UIDevice currentDevice] userMemory]];
    return value;
}


- (NSString*) freeMemory
{
    NSString* value;
    value = [NSString stringWithFormat:@"%d", [UIDevice freeMemory]];
    return value;
}


- (NSString*) totalDiskSpace
{
    NSNumber* totDiskSpace= [[UIDevice currentDevice] totalDiskSpace];
    NSString* value = [totDiskSpace stringValue];
    return value;
}


- (NSString*) freeDiskSpace
{
    NSNumber* theFreeDiskSpace= [[UIDevice currentDevice] freeDiskSpace];
    NSString* value = [theFreeDiskSpace stringValue];
    return value;
}

Respondido el 09 de enero de 11 a las 06:01

El código es correcto. La sugerencia de que sería útil en una aplicación del mundo real es incorrecta. - bbum

De acuerdo, odio ser un palo en el barro, pero UIDevice no tiene ninguno de esos métodos enumerados en la documentación ... ¿son privados? - BadPirate

FYI: En XCode 5 este código no se compilará con varios errores que se parecen a esto: No @interface visible para 'UIDevice' declara el selector 'totalMemory' - Mate

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.