diff --git a/SDWebImage/SDImageCache.m b/SDWebImage/SDImageCache.m index 171e3586..6c17bee4 100644 --- a/SDWebImage/SDImageCache.m +++ b/SDWebImage/SDImageCache.m @@ -10,11 +10,38 @@ #import "SDWebImageDecoder.h" #import #import "SDWebImageDecoder.h" - -static NSInteger cacheMaxCacheAge = 60*60*24*7; // 1 week +#import +#import 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]; } }