New file |
| | |
| | | // |
| | | // YYMemoryCache.h |
| | | // YYCache <https://github.com/ibireme/YYCache> |
| | | // |
| | | // Created by ibireme on 15/2/7. |
| | | // Copyright (c) 2015 ibireme. |
| | | // |
| | | // This source code is licensed under the MIT-style license found in the |
| | | // LICENSE file in the root directory of this source tree. |
| | | // |
| | | |
| | | #import <Foundation/Foundation.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | YYMemoryCache is a fast in-memory cache that stores key-value pairs. |
| | | In contrast to NSDictionary, keys are retained and not copied. |
| | | The API and performance is similar to `NSCache`, all methods are thread-safe. |
| | | |
| | | YYMemoryCache objects differ from NSCache in a few ways: |
| | | |
| | | * It uses LRU (least-recently-used) to remove objects; NSCache's eviction method |
| | | is non-deterministic. |
| | | * It can be controlled by cost, count and age; NSCache's limits are imprecise. |
| | | * It can be configured to automatically evict objects when receive memory |
| | | warning or app enter background. |
| | | |
| | | The time of `Access Methods` in YYMemoryCache is typically in constant time (O(1)). |
| | | */ |
| | | @interface YYMemoryCache : NSObject |
| | | |
| | | #pragma mark - Attribute |
| | | ///============================================================================= |
| | | /// @name Attribute |
| | | ///============================================================================= |
| | | |
| | | /** The name of the cache. Default is nil. */ |
| | | @property (nullable, copy) NSString *name; |
| | | |
| | | /** The number of objects in the cache (read-only) */ |
| | | @property (readonly) NSUInteger totalCount; |
| | | |
| | | /** The total cost of objects in the cache (read-only). */ |
| | | @property (readonly) NSUInteger totalCost; |
| | | |
| | | |
| | | #pragma mark - Limit |
| | | ///============================================================================= |
| | | /// @name Limit |
| | | ///============================================================================= |
| | | |
| | | /** |
| | | The maximum number of objects the cache should hold. |
| | | |
| | | @discussion The default value is NSUIntegerMax, which means no limit. |
| | | This is not a strict limit—if the cache goes over the limit, some objects in the |
| | | cache could be evicted later in backgound thread. |
| | | */ |
| | | @property NSUInteger countLimit; |
| | | |
| | | /** |
| | | The maximum total cost that the cache can hold before it starts evicting objects. |
| | | |
| | | @discussion The default value is NSUIntegerMax, which means no limit. |
| | | This is not a strict limit—if the cache goes over the limit, some objects in the |
| | | cache could be evicted later in backgound thread. |
| | | */ |
| | | @property NSUInteger costLimit; |
| | | |
| | | /** |
| | | The maximum expiry time of objects in cache. |
| | | |
| | | @discussion The default value is DBL_MAX, which means no limit. |
| | | This is not a strict limit—if an object goes over the limit, the object could |
| | | be evicted later in backgound thread. |
| | | */ |
| | | @property NSTimeInterval ageLimit; |
| | | |
| | | /** |
| | | The auto trim check time interval in seconds. Default is 5.0. |
| | | |
| | | @discussion The cache holds an internal timer to check whether the cache reaches |
| | | its limits, and if the limit is reached, it begins to evict objects. |
| | | */ |
| | | @property NSTimeInterval autoTrimInterval; |
| | | |
| | | /** |
| | | If `YES`, the cache will remove all objects when the app receives a memory warning. |
| | | The default value is `YES`. |
| | | */ |
| | | @property BOOL shouldRemoveAllObjectsOnMemoryWarning; |
| | | |
| | | /** |
| | | If `YES`, The cache will remove all objects when the app enter background. |
| | | The default value is `YES`. |
| | | */ |
| | | @property BOOL shouldRemoveAllObjectsWhenEnteringBackground; |
| | | |
| | | /** |
| | | A block to be executed when the app receives a memory warning. |
| | | The default value is nil. |
| | | */ |
| | | @property (nullable, copy) void(^didReceiveMemoryWarningBlock)(YYMemoryCache *cache); |
| | | |
| | | /** |
| | | A block to be executed when the app enter background. |
| | | The default value is nil. |
| | | */ |
| | | @property (nullable, copy) void(^didEnterBackgroundBlock)(YYMemoryCache *cache); |
| | | |
| | | /** |
| | | If `YES`, the key-value pair will be released on main thread, otherwise on |
| | | background thread. Default is NO. |
| | | |
| | | @discussion You may set this value to `YES` if the key-value object contains |
| | | the instance which should be released in main thread (such as UIView/CALayer). |
| | | */ |
| | | @property BOOL releaseOnMainThread; |
| | | |
| | | /** |
| | | If `YES`, the key-value pair will be released asynchronously to avoid blocking |
| | | the access methods, otherwise it will be released in the access method |
| | | (such as removeObjectForKey:). Default is YES. |
| | | */ |
| | | @property BOOL releaseAsynchronously; |
| | | |
| | | |
| | | #pragma mark - Access Methods |
| | | ///============================================================================= |
| | | /// @name Access Methods |
| | | ///============================================================================= |
| | | |
| | | /** |
| | | Returns a Boolean value that indicates whether a given key is in cache. |
| | | |
| | | @param key An object identifying the value. If nil, just return `NO`. |
| | | @return Whether the key is in cache. |
| | | */ |
| | | - (BOOL)containsObjectForKey:(id)key; |
| | | |
| | | /** |
| | | Returns the value associated with a given key. |
| | | |
| | | @param key An object identifying the value. If nil, just return nil. |
| | | @return The value associated with key, or nil if no value is associated with key. |
| | | */ |
| | | - (nullable id)objectForKey:(id)key; |
| | | |
| | | /** |
| | | Sets the value of the specified key in the cache (0 cost). |
| | | |
| | | @param object The object to be stored in the cache. If nil, it calls `removeObjectForKey:`. |
| | | @param key The key with which to associate the value. If nil, this method has no effect. |
| | | @discussion Unlike an NSMutableDictionary object, a cache does not copy the key |
| | | objects that are put into it. |
| | | */ |
| | | - (void)setObject:(nullable id)object forKey:(id)key; |
| | | |
| | | /** |
| | | Sets the value of the specified key in the cache, and associates the key-value |
| | | pair with the specified cost. |
| | | |
| | | @param object The object to store in the cache. If nil, it calls `removeObjectForKey`. |
| | | @param key The key with which to associate the value. If nil, this method has no effect. |
| | | @param cost The cost with which to associate the key-value pair. |
| | | @discussion Unlike an NSMutableDictionary object, a cache does not copy the key |
| | | objects that are put into it. |
| | | */ |
| | | - (void)setObject:(nullable id)object forKey:(id)key withCost:(NSUInteger)cost; |
| | | |
| | | /** |
| | | Removes the value of the specified key in the cache. |
| | | |
| | | @param key The key identifying the value to be removed. If nil, this method has no effect. |
| | | */ |
| | | - (void)removeObjectForKey:(id)key; |
| | | |
| | | /** |
| | | Empties the cache immediately. |
| | | */ |
| | | - (void)removeAllObjects; |
| | | |
| | | |
| | | #pragma mark - Trim |
| | | ///============================================================================= |
| | | /// @name Trim |
| | | ///============================================================================= |
| | | |
| | | /** |
| | | Removes objects from the cache with LRU, until the `totalCount` is below or equal to |
| | | the specified value. |
| | | @param count The total count allowed to remain after the cache has been trimmed. |
| | | */ |
| | | - (void)trimToCount:(NSUInteger)count; |
| | | |
| | | /** |
| | | Removes objects from the cache with LRU, until the `totalCost` is or equal to |
| | | the specified value. |
| | | @param cost The total cost allowed to remain after the cache has been trimmed. |
| | | */ |
| | | - (void)trimToCost:(NSUInteger)cost; |
| | | |
| | | /** |
| | | Removes objects from the cache with LRU, until all expiry objects removed by the |
| | | specified value. |
| | | @param age The maximum age (in seconds) of objects. |
| | | */ |
| | | - (void)trimToAge:(NSTimeInterval)age; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |