美文网首页
NSCache-gnustep/libs-base

NSCache-gnustep/libs-base

作者: Code_人生 | 来源:发表于2019-09-30 13:59 被阅读0次
  • gnustep/libs-base源码搜索NSCache
  • 来到NSCache.h
- (void) setObject: (GS_GENERIC_TYPE(ValT))obj
            forKey: (GS_GENERIC_TYPE(KeyT))key
              cost: (NSUInteger)num;
- (void) setObject: (id)obj forKey: (id)key cost: (NSUInteger)num
{
  _GSCachedObject *oldObject = [_objects objectForKey: key];
  _GSCachedObject *newObject;

  if (nil != oldObject)
    {
      [self removeObjectForKey: oldObject->key];
    }
  [self _evictObjectsToMakeSpaceForObjectWithCost: num];
  newObject = [_GSCachedObject new];
  // Retained here, released when obj is dealloc'd
  newObject->object = RETAIN(obj);
  newObject->key = RETAIN(key);
  newObject->cost = num;
  if ([obj conformsToProtocol: @protocol(NSDiscardableContent)])
    {
      newObject->isEvictable = YES;
      [_accesses addObject: newObject];
    }
  [_objects setObject: newObject forKey: key];
  RELEASE(newObject);
  _totalCost += num;
}
  • 点击_evictObjectsToMakeSpaceForObjectWithCost
- (void)_evictObjectsToMakeSpaceForObjectWithCost: (NSUInteger)cost
{
  NSUInteger spaceNeeded = 0;
  NSUInteger count = [_objects count];

  if (_costLimit > 0 && _totalCost + cost > _costLimit)
    {
      spaceNeeded = _totalCost + cost - _costLimit;
    }

  // Only evict if we need the space.
  if (count > 0 && (spaceNeeded > 0 || count >= _countLimit))
    {
      NSMutableArray *evictedKeys = nil;
      // Round up slightly.
      NSUInteger averageAccesses = ((_totalAccesses / (double)count) * 0.2) + 1;
      NSEnumerator *e = [_accesses objectEnumerator];
      _GSCachedObject *obj;

      if (_evictsObjectsWithDiscardedContent)
    {
      evictedKeys = [[NSMutableArray alloc] init];
    }
      while (nil != (obj = [e nextObject]))
    {
      // Don't evict frequently accessed objects.
      if (obj->accessCount < averageAccesses && obj->isEvictable)
        {
          [obj->object discardContentIfPossible];
          if ([obj->object isContentDiscarded])
        {
          NSUInteger cost = obj->cost;

          // Evicted objects have no cost.
          obj->cost = 0;
          // Don't try evicting this again in future; it's gone already.
          obj->isEvictable = NO;
          // Remove this object as well as its contents if required
          if (_evictsObjectsWithDiscardedContent)
            {
              [evictedKeys addObject: obj->key];
            }
          _totalCost -= cost;
          // If we've freed enough space, give up
          if (cost > spaceNeeded)
            {
              break;
            }
          spaceNeeded -= cost;
        }
        }
    }
      // Evict all of the objects whose content we have discarded if required
      if (_evictsObjectsWithDiscardedContent)
    {
      NSString *key;

      e = [evictedKeys objectEnumerator];
      while (nil != (key = [e nextObject]))
        {
          [self removeObjectForKey: key];
        }
    }
    [evictedKeys release];
    }
}

相关文章

  • NSCache-gnustep/libs-base

    gnustep/libs-base源码搜索NSCache 来到NSCache.h 点击_evictObjectsT...

  • NSOperation

    一、start gnustep/libs-base源码搜索NSOperation 来到NSOperation.h ...

网友评论

      本文标题:NSCache-gnustep/libs-base

      本文链接:https://www.haomeiwen.com/subject/ewvdyctx.html