Вы используете его так же, как и NSMutableDictionary
. Разница в том, что когда NSCache
обнаруживает чрезмерное давление памяти (т. Е. Кэширует слишком много значений), оно освобождает некоторые из этих значений, чтобы освободить место.
Если вы можете воссоздать эти значения во время выполнения (путем загрузки из Интернета, выполнения вычислений и т. Д.), Тогда NSCache
может удовлетворить ваши потребности. Если данные не могут быть воссозданы (например, они введены пользователем, они чувствительны ко времени и т. Д.), Вам не следует хранить их в NSCache
, поскольку они будут там уничтожены.
Пример, не учитывающий безопасность потоков:
// Your cache should have a lifetime beyond the method or handful of methods
// that use it. For example, you could make it a field of your application
// delegate, or of your view controller, or something like that. Up to you.
NSCache *myCache = ...;
NSAssert(myCache != nil, @"cache object is missing");
// Try to get the existing object out of the cache, if it's there.
Widget *myWidget = [myCache objectForKey: @"Important Widget"];
if (!myWidget) {
// It's not in the cache yet, or has been removed. We have to
// create it. Presumably, creation is an expensive operation,
// which is why we cache the results. If creation is cheap, we
// probably don't need to bother caching it. That's a design
// decision you'll have to make yourself.
myWidget = [[[Widget alloc] initExpensively] autorelease];
// Put it in the cache. It will stay there as long as the OS
// has room for it. It may be removed at any time, however,
// at which point we'll have to create it again on next use.
[myCache setObject: myWidget forKey: @"Important Widget"];
}
// myWidget should exist now either way. Use it here.
if (myWidget) {
[myWidget runOrWhatever];
}