「 iOS 知识小集 」2018 · 第 24 期
上周公众号发布的以下文章:
- iOS 图形处理概论
- 再谈 __bridge, __bridge_transfer, __bridge_retained(内有彩蛋)
- Flutter 的编译模式
- 这些流行编程语言你会哪些?
- 简报 · 第 5 期
本期知识小集的主要内容包括:
- 再谈数组、集合、字典与 hash、isEqual 方法的关联
- 使用 Keychain 存储登录态需要注意的一个坑
- 给 UIView 添加阴影
- 比较三种网络框架上传图片过程中的不同点?
- 通过 runtime 控制导航栏的 hidden 属性
- 关于 IAP 丢单的处理
再谈数组、集合、字典与 hash、isEqual 方法的关联
作者: halohily
我们或多或少了解,Objective-C 中的 NSArray、NSSet、NSDictionary 与 NSObject 及其子类对象的 hash、isEqual 方法有许多联系,这篇小集讲一下其中的一些细节。
NSArray 允许添加重复元素,添加元素时不查重,所以不调用上述两个方法。在移除元素时,会对当前数组内的元素进行遍历,每个元素的 isEqual 方法都会被调用(使用 remove 方法传入的元素作为参数),所有返回真值的元素都被移除。在字典中,不涉及 hash 方法。
NSSet 不允许添加重复元素,所以添加新元素时,该元素的 hash 方法会被调用。若集合中不存在与此元素 hash 值相同的元素,则它直接被加入集合,不调用 isEqual 方法;若存在,则调用集合内的对应元素的 isEqual 方法,返回真值则判等,不加入,处理结束。若返回 false,则判定集合内不存在该元素,将其加入。
从集合中移除元素时,首先调用它的 hash 方法。若集合中存在与其 hash 值相等的元素,则调用该元素的 isEqual 方法,若真值则判等,进行移除;若不存在,则会依次调用集合中每个元素的 isEqual 方法,只要找到一个返回真值的元素,就进行移除,并结束整个过程。(所以这样会有其他满足 isEqual 方法但却被漏掉未被移除的元素)。调用 contains 方法时,过程类似。
因此,若某自定义对象会被加入到集合或作为字典的 key 时,需要同时重写 isEqual 方法和 hash 方法。这样,若集合中某元素存在,则调用它的 contains 和 remove 方法时,可以在 O(1) 完成查询。否则,查询它的时间复杂度提升为 O(n)。
值得注意的是,NSDictionary 的键和值都是对象类型即可。但是被设为键的对象需要遵守 NSCopying 协议。
使用 Keychain 存储登录态需要注意的一个坑
作者: KANGZUBIN
今天要讨论的这个问题你可能永远都不会遇到,而且绝大部分情况下你很难在开发中事先预料到它未来可能会发生,但是一旦不幸发生了,可能就是一个很严重的线上问题,惨痛教训。
我们通常会在 Keychain(钥匙串)中存储一些密码、用户登录态等敏感数据,一是可以提高保存数据的安全性;二是当用户卸载 App 后重新安装,可以自动登录保留上次的登录态;三是同一开发者账号下的不同 App,如果是采用同一套账户体系,就可以通过 Keychain Groups 共享登录态。
我们的 App 之前都是只把用户的登录态保存在 Keychain 中,并在 App 启动时去读取它,这一直也都没什么问题。前一段时间我们的 App 由于业务合规的原因审核被拒,按照苹果的要求不得不把 App 从公司的 A 开发者账号转让到 B 开发者账号下(公司旗下有很多不同主体的开发者账号),转让过程很顺利,但发版后短时间内收到大面积的用户反馈说,更新新版本后提示“登录失效,需要重新登录”。
原因很容易就可以猜到,App 从 A 转让到 B,就无法读取保存在 A 账号下的 Keychain 数据了,用户更新版本覆盖安装后,打开 App 也就无法获取之前的登录态了。
而且对于这种已经发生的问题,我们似乎也没有什么有效的补救措施,临时加急再发一版似乎也解决不了问题,因为之前的 Keychain 数据就是读取不到了,总不能再把 App 转让回去吧,
「 iOS 知识小集 」2018 · 第 24 期相关推荐
- 「 iOS 知识小集 」2018 · 第 23 期
上周公众号发布的以下文章: 美团客户端响应式框架 EasyReact 开源 巧妙利用 KVO 实现精准的 VC 耗时检测 微信小程序适配 iPhone X 总结 Shortcuts, Siri 功能增 ...
- 「 iOS知识小集 」2018 · 第 38 期
原文链接 更新:前两周我们发了一条小集<Xcode 10.1 并没有修复由于 Assets 引起的在 iOS 9 上的崩溃问题>,根据最新消息,苹果已经在服务器端解决了这个问题,开发者通过 ...
- 「 iOS知识小集 」2018 · 第 35 期
原文链接 上周公众号发布的以下文章: Flutter中Hybrid的实现 不改代码,Link-Time Optimization提高iOS代码效率 + 汇编代码原理分析 关于 Block 的几点思考 ...
- 「 iOS知识小集 」2018 · 第 29 期
原文链接 本周我们启动主题收集,如果你有想了解的 iOS 技术方面的主题,请在我们的 github https://github.com/awesome-tips/iOS-Tips/ 提 issue, ...
- 「医疗知识图谱」到「综合性医疗大脑」
本文首发于个人博客:www.bobinsun.cn 背景 最近,由于某些原因,特别关注了医疗知识图谱方面的发展&应用情况,有了些浅薄认识,故码此文,以供参考. 随着智能时代的到来,把临床数据. ...
- 一个barcode 多个 sku号_「小白知识帖」什么是亚马逊SKU?编写SKU还有这些讲究……...
初入亚马逊的小白卖家常会听大佬们提到SKU.其实理解SKU和其作用很简单,但真正需要掌握的是如何编写有效的SKU.这些小细节的内容往往可以让小白卖家成长的更快. 什么是SKU? SKU(Stock K ...
- iOS知识小集·NSNumber to NSString出错啦
起因 某一次准备把一个NSNumber显示在lable上. NSString *text = [NSString stringWithFormat:@"%@",value]; 复制 ...
- 专题解读 |「知识图谱」领域近期值得读的 6 篇顶会论文
本期内容选编自微信公众号「开放知识图谱」. CIKM 2017 ■ 论文 | Hike: A Hybrid Human-Machine Method for Entity Alignmentin La ...
- 知识小集 2018 下半年文章汇总及年终总结
又到岁末,又到了写总结,写愿景的时候.这里,我就来简单写写小集这一年的总结和下一年的展望吧. 总结 先简单列一下我们今年的产出: 公众号从 3月2号 开始,总共发了 42 期小集合集,以及 130+ ...
最新文章
- MagicLinux2.5正式版发布
- C#的dapper使用
- 了解 yarn 、npm、nodejs
- java 云笔记本_java版云笔记(五)
- linux监测文件输出命令,Linux-USB-检测枚举-1 lsusb输出内容详细解读
- 厉害了!这项技术BAT力捧!程序员:我彻底慌了...
- c语言编写记账程序,C语言会计记账管理系统
- 从HCNA到HCIE的运营商工程师走过的路,迈过的坎,欢迎参考自身情况
- 如何实现批量替换文件夹名称?
- CSS练习中|无序列表中,<li>的小黑点如何替换为图片(菜鸡趣味学习,细节到每一步)
- android 转发朋友圈,微信怎么转发朋友圈 转发朋友圈方法详细教程
- 怎样让Excel数据自动标记颜色?学会这一招让大家对你刮目相看
- 博弈论:子博弈精炼均衡(子博弈都是纳什均衡,比纳什均衡更强的概念)
- Windows搭建Nginx直播推流服务器
- vue-easy-print批量分页打印
- ruoyi数据权限设置
- 1 Microservice 简介
- 【已解决】CSDN无法粘贴图片、截图 或者 上传图片一直显示失败
- 杭电信工计算机专业浙江省排名第几,2017杭州电子科技大学专业排名_杭州电子科技大学专业排行榜(2)...
- 张艾迪(创始人):创始人故事无限N个
热门文章
- centos 7(桌面应用)-桌面的应用合集
- 饥荒如何修改服务器人数上限,饥荒联机版房间人数上限可以修改吗?怎么更改房间人数?...
- 女测试工程师的成长(1-4)
- High Performance Visual Tracking with Siamese Region Proposal Network 论文学习
- 祭 事 本
- python好学吗-python容易学么
- excel怎么批量插行_excel怎么批量隔行插入一行空白行?
- 同局域网 手机访问本地服务器
- 【2023】浙江大学计算机考研信息汇总
- 仿网易云音乐 web 版 vue-163-music