Memory cache reserves 12MB free RAM to prevent watchdog from killing the app before memory warning is sent

This commit is contained in:
clowwindy 2012-06-03 22:17:08 +08:00 committed by Olivier Poitrey
parent 248fbc2148
commit 0bce0b99bc
1 changed files with 42 additions and 3 deletions

View File

@ -10,11 +10,38 @@
#import "SDWebImageDecoder.h"
#import <CommonCrypto/CommonDigest.h>
#import "SDWebImageDecoder.h"
static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week
#import <mach/mach.h>
#import <mach/mach_host.h>
static SDImageCache *instance;
static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week
static natural_t minFreeMemLeft = 1024*1024*12; // reserve 12MB RAM
// inspired by http://stackoverflow.com/questions/5012886/knowing-available-ram-on-an-ios-device
static natural_t get_free_memory(void)
{
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;
if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS)
{
NSLog(@"Failed to fetch vm statistics");
return 0;
}
/* Stats in bytes */
natural_t mem_free = vm_stat.free_count * pagesize;
return mem_free;
}
@implementation SDImageCache
#pragma mark NSObject
@ -151,6 +178,10 @@ static SDImageCache *instance;
if (image)
{
if (get_free_memory() < minFreeMemLeft)
{
[memCache removeAllObjects];
}
[memCache setObject:image forKey:key];
if ([delegate respondsToSelector:@selector(imageCache:didFindImage:forKey:userInfo:)])
@ -196,7 +227,11 @@ static SDImageCache *instance;
{
return;
}
if (get_free_memory() < minFreeMemLeft)
{
[memCache removeAllObjects];
}
[memCache setObject:image forKey:key];
if (toDisk)
@ -248,6 +283,10 @@ static SDImageCache *instance;
image = SDScaledImageForPath(key, [NSData dataWithContentsOfFile:[self cachePathForKey:key]]);
if (image)
{
if (get_free_memory() < minFreeMemLeft)
{
[memCache removeAllObjects];
}
[memCache setObject:image forKey:key];
}
}