美文网首页
2.NSDictionary

2.NSDictionary

作者: aofeilin | 来源:发表于2018-09-14 18:41 被阅读15次

参考 https://www.jianshu.com/p/2fd9680b46f6
哈希概念:哈希表的本质是一个数组,数组中每一个元素称为一个箱子(bin),箱子中存放的是键值对。
简单了解总结,
1.NSMapTable 结构体里面包含一个map数组,数组里面存储
2.NSConcreteMapTable
将键和值添加到表中。<br />
*如果表中已存在等号,则替换其映射值
*使用新的,无需更换密钥本身。<br

301129-ff337872b5a8a2f3.png
BC5ACD13-BD84-4FFB-B09E-8E7FBBF0D700.png
Nsdictionary:::::::
//根据key来  存储位置bucket种位置,
GSIMapBucketForKey(GSIMapTable map, GSIMapKey key)
{
  return GSIMapPickBucket(GSI_MAP_HASH(map, key),
    map->buckets, map->bucketCount);
}
GSIMapPickBucket(unsigned hash, GSIMapBucket buckets, uintptr_t bucketCount)
{
  return buckets + hash % bucketCount;
}
//Bucket 里面存储nodeCount 和fristNode
struct  _GSIMapBucket {
  uintptr_t nodeCount;  /* Number of nodes in bucket.   */
  GSIMapNode    firstNode;  /* The linked list of nodes.    */
};

//将键和值添加到表中。<br />
  *如果表中已存在等号,则替换其映射值
  *使用新的,无需更换密钥本身。<br />
  *如果key等于表的notAKeyMarker字段
  * NSMapTableKeyCallBacks,引发NSInvalidArgumentException。

void NSMapInsert(NSMapTable *table, const void *key, const void *value)
{
  if (table == nil)
    {
      [NSException raise: NSInvalidArgumentException
          format: @"Attempt to place key-value in null table"];
    }
  if (object_getClass(table) == concreteClass)
    {
      GSIMapTable   t = (GSIMapTable)table;
      GSIMapNode    n;

      if (t->legacy == YES)
    {
      if (key == t->cb.old.k.notAKeyMarker)
        {
          [NSException raise: NSInvalidArgumentException
                  format: @"Attempt to place notAKeyMarker in map"];
        }
    }
      else if (key == 0)
    {
      [NSException raise: NSInvalidArgumentException
              format: @"Attempt to place nil key in map"];
    }
      n = GSIMapNodeForKey(t, (GSIMapKey)key);
      if (n == 0)
    {
      GSIMapAddPair(t, (GSIMapKey)key, (GSIMapVal)value);
      t->version++;
    }
      else if (n->value.ptr != value)
    {
      GSIMapVal tmp = n->value;

      n->value = (GSIMapVal)value;
      GSI_MAP_RETAIN_VAL(t, n->value);
      GSI_MAP_RELEASE_VAL(t, tmp);
      t->version++;
    }
    }
  else
    {
      [table setObject: (id)value forKey: (id)key];
    }
}

相关文章

  • 2.NSDictionary

    参考 https://www.jianshu.com/p/2fd9680b46f6哈希概念:哈希表的本质是一个数组...

  • iOS开发之数据转换

    1.NSDictionary转NSData【相互转换】 2.NSDictionary转NSString(需要先将N...

  • Objective-C 数据类型转换

    1.NSDictionary转NSData【相互转换】 2.NSDictionary转NSString(需要先将N...

  • NSDictionary

    // 1.NSDictionary字典的初始化(常见的几种方式) // 2.NSDictionary的操作 // ...

  • 蓝鲸传媒

    1.int NSInteger 的区别,什么时候用?2.NSDictionary 和 NSArray 什么场景用这...

  • 工作手册小记

    1.代码注释规范 2.NSDictionary手动解析的时候,NSString接收需要强制转换,避免后端传回类型是...

网友评论

      本文标题:2.NSDictionary

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