美文网首页
(转)CFBag

(转)CFBag

作者: 指尖猿 | 来源:发表于2016-10-22 00:29 被阅读34次

前文,看到技术美文,忍不住想拿出来分享.下面是原文地址

点击原文地址

Objective-C被夹在了两个世界中间

在其中一边的世界里,Objective-C遵循着经过深思熟虑的、发扬自[Smalltalk]的面向对象哲学理念,这种理念给我们带来了消息传递和参数命名法等好点子。另一边的世界里则避免不了有很多C的残留思想带来强大的力量和一坨混乱

越来越多@符号的使用证明了这个一致性危机。

Foundation和Core Foundation的关系里也可以发现这种一致性问题,特别是那一堆无缝连接的类: NSArray / CFArray, NSDictionary / CFDictionary, NSSet / CFSet。这些类可以通过C函数和Objective-C方法传入传出而不需要手动转换。这是抽象化设计的缺陷,但是同时也是写应用时最实用的优化最难以优化部分的绝佳手段。

Bag,一种抽象数据类型

在计算机科学领域集合数据类型的殿堂中,bag没有数组、集合、联合数组、树、图、优先队列那么占有一席之地。

其实bag本身就很晦涩,你可能从没听过这东西。

Bag,或者叫做multiset,是set的一种变体,不同的是bag里同一数据可以出现不止一次。集合中每一个唯一元素会有一个合计数字与其绑定。类似set一样,bag也是顺序不敏感的。

用bag的场景有...咳咳...很少,但有如果它出现你肯定能感觉到那就是bag。大选中统计票数?模拟家庭作业中的概率分布?实现一个Yahtzee骰子游戏?Bag都是你的新选择!

使用CFMutableBag

CFBag 和它的可变类型同类 CFMutableBag 作为bag类型的具体实现,都是非常灵活的。

虽然它们没有像 NSCountedSet 那样方便地面向对象化,但它可以进行的自定义行为却是多种多样的。你可以用带有许多回调的初始化函数来建立一个 CFBag ,这些回调函数定义在 CFBagCallBacks 结构中,该结构详细描述了一个值被插入、删除、比较的方法:

struct CFBagCallBacks {

CFIndex version;

CFBagRetainCallBack retain;

CFBagReleaseCallBack release;

CFBagCopyDescriptionCallBack copyDescription;

CFBagEqualCallBack equal;

CFBagHashCallBack hash;

};

typedef struct CFBagCallBacks CFBagCallBacks;

retain: 当一个值被添加到集合里时用于retain它的回调

release: 当一个值被从集合里删除时用于release它的回调

copyDescription: 用于集合中每个值建立一个string类型的description的回调

equal: 用于比较集合中两个值是否相等的回调

hash: 集合中用于计算值的Hash的回调

例如,如果你正在做一个投票统计应用,你可以制定一个用于 retain 回调函数来保证不同大小写和错误拼写的名字能够归类到正确的候选人;也可以用 equal 回调函数来保证当所有选票都统计完时能够计算出票最多的候选人。

CFMutableBag 也有 CFBagApplyFunction,这个函数可以用来改变集合中的值,比如说理顺选举数量之类的。

总而言之,如果你要准备搞一个选举, CFBag 是你的最佳选择。

严肃地讲, CFBag 在它擅长的领域内确实好用,它时刻提醒着你这是标准框架和标准库中的一块隐藏的宝石,而发觉隐藏的宝藏,就是成为一个NSHipster的核心。

同样的,CFBinaryHeap 呢? NSPointerFunctions 呢? NSMapTable 呢?有心想学,善用搜索引擎!

相关文章

  • (转)CFBag

    前文,看到技术美文,忍不住想拿出来分享.下面是原文地址 点击原文地址 Objective-C被夹在了两个世界中间 ...

  • 转,转,转

    其实,过年就是地球公转又多转了一圈而已;而每一个白昼和黑夜的更替只是地球又转了一圈罢了。人生在世,就是辗转反侧,度...

  • 转?转!~转~

    这是什么破任务 拽什么你 你装什么 还要怎样转 就一个这个东西 还要花心思这样对待 当我的时间是辣鸡吗 当我的精力...

  • 转呀转 转呀转

    看着闪闪的标识 脑子里真空的什么都不剩下 保鲜袋上的生产日期 怎么找也找不到 明天的气温貌似要下调 太阳要和月亮商...

  • 转呀,转呀,转呀转。

    如果养成了习惯, 那么就会在固定的时间去转。 就像我这样, 一不小心就这样了。 嘎嘎嘎, 笑出鸭叫声。 不是我有多...

  • 山转——水转——人转——心转

    山不转水转,水不转人转,人不转心转。 这是早晨跑步时听的一篇文章中印象最深的一句话。 山不转那水在转 ,水不转那云...

  • 转啊转

    在地铁的车厢里,我会痴痴地望向一头。 等待它进入弯道,呈现渐渐弯曲的视觉。 这让我短暂入迷,像眺无尽的时空隧道。 ...

  • 转啊转

    在地铁的车厢里,我会痴痴地望向一头。 等待它进入弯道,呈现渐渐弯曲的视觉。 这让我短暂入迷,像眺无尽的时空隧道。 ...

  • 转啊转

    睁眼 阳光乍泻 不用说 地球又要带着我一起运动 在我面前直着身子匀溜溜地自转 和我一块从这儿到那儿来回走一段距...

  • python3.7常用类型转换

    转str 转int 转long 转float 转List 转Dict

网友评论

      本文标题:(转)CFBag

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