『libextobjc』Objctive-C 协议的默认实现

继续阅读 libextobjc 的源码,看到一个非常有趣的实现—— Objective-C 的 protocol 默认实现。当然,这不比 Swift 的 extension 默认实现,Objective-C 在这方面没有 Swift 强大,并不能完全的实现 POP,但是这不妨给我们提供一种思路。

继续阅读『libextobjc』Objctive-C 协议的默认实现

『libextobjc』@weakify 与 @strongify 的实现

libextobjc 对 Objective-C 做了非常多的扩展,包括 protocol 默认实现、 @keypath()@weakify()@onExit() 等等。其中对 runtime 与宏定义的使用可谓出神入化,本文将讨论 @weakify() 的实现。

继续阅读『libextobjc』@weakify 与 @strongify 的实现

『Apple API』从 NSDictitonary 中学接口定义

学习最规范的接口定义,最好的方式就是看官方 API。平时常用的 NSDictionary 中,也有很多以前未注意到的地方。当然,除了看如何使用以外,更为重要的是理解、总结这样设计的原因,在开发过程中也注意实践。

继续阅读『Apple API』从 NSDictitonary 中学接口定义

Cocoa 集合类型:NSPointerArray,NSMapTable,NSHashTable

iOS 中有很多种集合类型,最为常见的可能就 NSArrayNSDictionaryNSSet,但其实还有 NSPointerArrayNSMapTableNSHashTable 等类型,虽然后面三个类型不常见,但是它们能在关键时刻,「救你一命」。

继续阅读Cocoa 集合类型:NSPointerArray,NSMapTable,NSHashTable

『Apple API』NS_UNAVAILABLE 与 NS_DESIGNATED_INITIALIZER

当面对多个初始化方法时,外部调用者往往会手足无措,不知道哪一个才是正确的初始化方法,对此,苹果提供了两个关键字:NS_UNAVAILABLENS_DESIGNATED_INITIALIZER 来帮助我们约束定义方式,使得接口描述更加清晰。

继续阅读『Apple API』NS_UNAVAILABLE 与 NS_DESIGNATED_INITIALIZER

Block 梳理与疑问

时隔一年,再次读 《Objective-C 高级编程》,看到 block 一章,这一次从头至尾的跟着编译了一次,理清楚了很多之前不理解的地方,但是也同时多出了许多疑问。本文是在和学渣裙的朋友们分享以后的梳理笔记,有问题欢迎指出,如果能解决最后的几个小疑问,就更好了。

继续阅读Block 梳理与疑问

『Git』rebase or merge

Git 是 Linus Torvalds 除了 Linux 之外,对人类的又一大贡献。作为一名开发者,相信大家也或多或少接触过 Git。当然,我平时也用,但只能说『能用』,谈不上熟练,每次要合并、撤销的时候,都心惊胆战的,这些都源于对 Git 的不熟悉。终于,决定从头梳理一遍 Git 的用法,感谢@小锅的悉心教导。前段时间在组内做 Git 分享的时候,几个开发小组都再说自己的 Git 远程 log 太乱,乱到没眼看的那种,终于 iOS 组决定先试试水,看看完全一条线的 Git log 有什么优劣势。

以下便是我的调研结果,以及我组现在的 Git 实践。

继续阅读『Git』rebase or merge

『有趣的 Layer』CAGradientLayer 与 mask

CALayer 有个 mask 属性,用作 layer 的遮罩。这个遮罩和普通盖在上面的显示层不同,普通的遮罩是,盖上去,就遮住了下面的内容,而 mask 则是遮什么显示什么。

这一特性,在实现某些效果时,往往会有奇效。本文就来看看如何用 mask 结合 CAGradientLayer 做出有趣的效果。

继续阅读『有趣的 Layer』CAGradientLayer 与 mask

『CoreBluetooth』8. 后台运行蓝牙服务

这是 CoreBluetooth 系列的最后一篇,其他文章可查看:

CoreBluetooth1 初识
CoreBluetooth2 作为 Central 时的数据读写
CoreBluetooth3 作为 Central 时的数据读写(补充)
CoreBluetooth4 作为 Central 时的数据读写(最佳实践)
CoreBluetooth5 作为 Central 时的数据读写(OTA 固件升级与文件传输)
CoreBluetooth6 作为 Peripheral 时的请求响应
CoreBluetooth7 作为 Peripheral 时的请求响应(最佳实践)

继续阅读『CoreBluetooth』8. 后台运行蓝牙服务

『CoreBluetooth』7. 作为 Peripheral 时的请求响应(最佳实践)

上一章讲到了 iOS 设备作为 peripheral 端的通信,在这之中还有很多细节和可以优化的地方,本章《最佳实践》将会一一提到。

继续阅读『CoreBluetooth』7. 作为 Peripheral 时的请求响应(最佳实践)

『CoreBluetooth』6. 作为 Peripheral 时的请求响应

之前几篇都详细的介绍了当 iOS 设备作为 central 时的读写操作,这一章将会介绍下在 iOS 设备作为 peripheral 时的相关处理。即使你只需要 central 的部分,我也建议你看一下本章内容,它对你了解整个蓝牙通信有帮助。

本文将会介绍以下内容:

  • 学习 CBPeripheralManager
  • 配置 service 和 characteristic。
  • 将构建的 service 和 characteristic 树形结构加入 peripheral。
  • 广播拥有的 service。
  • 在 central 写入数据时,做出相关响应。
  • 在 characteristic 数据更新时,告诉订阅的 central。

本章会举一些例子,但这些例子都是抽象化的,具体应该怎么去解决,还需要和需求结合。当然,下一章《最佳实践》也会提供一些想法。

继续阅读『CoreBluetooth』6. 作为 Peripheral 时的请求响应

『CoreBluetooth』5. 作为 Central 时的数据读写(OTA 固件升级与文件传输)

占坑文。并未详细介绍 OTA 更新,更多的是大文件传输需要注意的方面。

先期文章:

CoreBluetooth1 初识

CoreBluetooth2 作为 Central 时的数据读写

CoreBluetooth3 作为 Central 时的数据读写(补充)

CoreBluetooth4 作为 Central 时的数据读写(最佳实践)

代码可参考:

https://github.com/saitjr/STBLETool.git

继续阅读『CoreBluetooth』5. 作为 Central 时的数据读写(OTA 固件升级与文件传输)

『CoreBluetooth』4. 作为 Central 时的数据读写(最佳实践)

之前介绍了比较多的基础内容吧,本文会结合 API 中的最佳实践和自己在开发中遇到的问题来谈谈需要注意的地方。

当然,文本中的设备依然是作为 central 的。

如果只看这篇文章有不明白的话,可以先参考前几篇文章:

CoreBluetooth1 初识
CoreBluetooth2 作为 Central 时的数据读写
CoreBluetooth3 作为 Central 时的数据读写(补充)
CoreBluetooth5 作为 Central 时的数据读写(OTA 固件升级与文件传输)

在设备上一般都有很多地方要用到无线电通信,Wi-Fi、传统的蓝牙、以及使用 BLE 通信的 app 等等。这些服务都是很耗资源的,尤其是在 iOS 设备上。所以本文会讲解到如何正确的使用 BLE 以达到节能的效果。

继续阅读『CoreBluetooth』4. 作为 Central 时的数据读写(最佳实践)

『CoreBluetooth』3. 作为 Central 时的数据读写(补充)

上一章谈到了当设备作为 central 时,搜索、连接、读写的一些基本操作。几乎就是翻译了官方 API,除此之外,API 中还提到了一些枚举,以及蓝牙通信方面的其他知识,本文将一一介绍(不断更新中…)。

继续阅读『CoreBluetooth』3. 作为 Central 时的数据读写(补充)