mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-24 20:00:37 +00:00
docs: APM、多句柄数据上报SDK、软件测试小结
This commit is contained in:
@@ -1004,7 +1004,7 @@ CF_EXPORT CFRunLoopRef _CFRunLoopGet0(_CFThreadRef t) {
|
||||
}
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
可以看到 main.m 中,还没有 return 的时候当前 RunLoop 的内部结构中存在一个 **wakeup port** 的端口。查看 RunLoop 源代码 **wakeup port** 就是 mach port 的一种。
|
||||
|
||||
@@ -1096,7 +1096,7 @@ CF_EXPORT CFRunLoopRef _CFRunLoopGet0(_CFThreadRef t) {
|
||||
|
||||
7. RunLoop lifecycle
|
||||
|
||||

|
||||

|
||||
|
||||
休眠时 RunLoop 被 mach_msg 阻塞,等到消息到来,可以是手动给 RunLoop 的 wakeUpPort 发消息 mach_msg,或者是 timer、Source1。然后继续走到 RunLoop run,不断循环
|
||||
|
||||
|
||||
@@ -24,19 +24,19 @@
|
||||
#endif
|
||||
```
|
||||
- 对于你的某个 SDK,你在为某个方法、某个类、某个宏定义命名的时候需要注意选择合适的前缀
|
||||
比如。你的某个项目是在做监控,SDK 的名字叫做 Prism-Client。那么你的类名称、类方法名称、宏定义、分类名称、分类方法名称等都需要合适且统一的前缀,一般选取 `前3个字母组合`。当前的项目叫做 `PCT`。类前面加 PCT,类里面的方法不加前缀。分类名称加前缀 PCT,分类里面的方法前面加前缀,小写的 pct。
|
||||
比如。你的某个项目是在做监控,SDK 的名字叫做 Hermes-Client。那么你的类名称、类方法名称、宏定义、分类名称、分类方法名称等都需要合适且统一的前缀,一般选取 `前3个字母组合`。当前的项目叫做 `HCT`。类前面加 HCT,类里面的方法不加前缀。分类名称加前缀 HCT,分类里面的方法前面加前缀,小写的 HCT。
|
||||
普通类的方法不加前缀是因为普通类已经通过类名的唯一性确定了方法的唯一。
|
||||
分类里面方法加前缀是因为分类的方法在工程里面这个类都可以访问。所以要在方法前面区分
|
||||
```Objective-C
|
||||
// 安全的数据获取方法
|
||||
#ifndef PCT_SAFE_STRING
|
||||
#define PCT_SAFE_STRING(x) (x) != nil ? (x) : @""
|
||||
#ifndef HCT_SAFE_STRING
|
||||
#define HCT_SAFE_STRING(x) (x) != nil ? (x) : @""
|
||||
#endif
|
||||
|
||||
NSData+PCTAES.h
|
||||
- (NSData *)pct_AES128EncryptWithKey:(NSString *)key gIv:(NSString *)Iv;
|
||||
NSData+HCTAES.h
|
||||
- (NSData *)hct_AES128EncryptWithKey:(NSString *)key gIv:(NSString *)Iv;
|
||||
|
||||
PCTRequestFactory.h
|
||||
HCTRequestFactory.h
|
||||
+ (void)fetchUploadConfigurationWithRequestURL:(NSString *)requestUrlString
|
||||
params:(NSDictionary *)params
|
||||
success:(void (^)(PRCConfigurationModel*model))success
|
||||
@@ -60,11 +60,11 @@
|
||||
- 内联函数的定义须在调用之前
|
||||
- Objective-C 中内联函数用 NS_INLINE ,等价于 static inline。且内联函数的命名需要注意,在该模块内的内联函数需要加前缀。
|
||||
```Objective-C
|
||||
NS_INLINE NSString * PCTGetTableNameFromType(PCTLogTableType type){
|
||||
if (type == PCTLogTableTypeMeta) {
|
||||
NS_INLINE NSString * HCTGetTableNameFromType(HCTLogTableType type){
|
||||
if (type == HCTLogTableTypeMeta) {
|
||||
return PRC_LOG_TABLE_META;
|
||||
}
|
||||
if (type == PCTLogTableTypePayload) {
|
||||
if (type == HCTLogTableTypePayload) {
|
||||
return PRC_LOG_TABLE_PAYLOAD;
|
||||
}
|
||||
return @"";
|
||||
@@ -94,6 +94,6 @@
|
||||
NSLog(@"%zd", [AFNetworkReachabilityManager sharedManager].networkReachabilityStatus);
|
||||
}
|
||||
```
|
||||
之前在做一个类 `PCTRequestFactory` 用来管理网络相关的逻辑。需要判断网络状态,我们都知道 AFNetWorking 第一次判断网络状态得到的是 AFNetworkReachabilityStatusUnknown。而我的逻辑需要 SDK 启动的时候判断网络状态,然后去上报数据。所以刚开始 AFNetworkReachabilityStatusUnknown 显然不能上报 Crash 数据,所以想着是将第一次的网络状态获取放到 **load** 方法里。这样是没问题的,可以拿到网络状态,但是我们知道 load 是类加载的时候调用的,打开 Xcode 看到 Build Phases 里面 `Link BiBinary With Libraries` 这个里面的库的顺序决定了里面的类加载顺序。我们知道 Pod 的原理是在 Podfile 里面描述的 pod 库依赖,然后会按照字典序(首字母排序去)引入,所以 AFNetWorking 这个肯定早,所以会成功的。但是万一是人工手动去引入或者修改库的位置,则在 PCTRequestFactory 里面的 load 方法执行的时候不一定可以保证 AFNetworkReachabilityManager 已经加载好。所以将 load 逻辑移动到 init 里面。
|
||||
之前在做一个类 `HCTRequestFactory` 用来管理网络相关的逻辑。需要判断网络状态,我们都知道 AFNetWorking 第一次判断网络状态得到的是 AFNetworkReachabilityStatusUnknown。而我的逻辑需要 SDK 启动的时候判断网络状态,然后去上报数据。所以刚开始 AFNetworkReachabilityStatusUnknown 显然不能上报 Crash 数据,所以想着是将第一次的网络状态获取放到 **load** 方法里。这样是没问题的,可以拿到网络状态,但是我们知道 load 是类加载的时候调用的,打开 Xcode 看到 Build Phases 里面 `Link BiBinary With Libraries` 这个里面的库的顺序决定了里面的类加载顺序。我们知道 Pod 的原理是在 Podfile 里面描述的 pod 库依赖,然后会按照字典序(首字母排序去)引入,所以 AFNetWorking 这个肯定早,所以会成功的。但是万一是人工手动去引入或者修改库的位置,则在 HCTRequestFactory 里面的 load 方法执行的时候不一定可以保证 AFNetworkReachabilityManager 已经加载好。所以将 load 逻辑移动到 init 里面。
|
||||
|
||||
另外,load 方法一般只做和本类有关系的逻辑,比如 hook 方法。
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,7 @@
|
||||
|
||||
## 图片显示流程
|
||||
|
||||

|
||||

|
||||
|
||||
```objective-c
|
||||
UIImage *image = [UIImage imageNamed:@"test"];
|
||||
@@ -19,7 +19,7 @@ _imageView.image = image;
|
||||
|
||||
## YYImage 源码
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
很多框架使用锁都是 pthread_mutex_lock,分析原因
|
||||
|
||||
1
Chapter1 - iOS/1.93.md
Normal file
1
Chapter1 - iOS/1.93.md
Normal file
@@ -0,0 +1 @@
|
||||
# flutter 新功能引导
|
||||
@@ -96,3 +96,4 @@
|
||||
* [90、YYImage 框架原理,探索图片高效加载原理](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.90.md)
|
||||
* [91、二进制重排](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.91.md)
|
||||
* [92、flutter 无痕埋点](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.92.md)
|
||||
* [93、flutter 新功能引导](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.93.md)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[jQuery 1.9](http://blog.jquery.com/2013/01/15/jquery-1-9-final-jquery-2-0-beta-migrate-final-released/)发布。
|
||||
|
||||

|
||||

|
||||
|
||||
这是2.0版之前的最后一个新版本,有很多新功能,其中一个就是支持Source Map。
|
||||
|
||||
@@ -42,13 +42,13 @@ JavaScript脚本正变得越来越复杂。大部分源码(尤其是各种函
|
||||
|
||||
有了它,出错的时候,除错工具将直接显示原始代码,而不是转换后的代码。这无疑给开发者带来了很大方便。
|
||||
|
||||

|
||||

|
||||
|
||||
Chrome 浏览器支持这个功能。在 Developer Tools 的 Setting 设置中,确认选中 "Enable source maps"。
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
@@ -168,11 +168,11 @@ mappings:"AAAAA,BBBBB;CCCCC"
|
||||
|
||||
VLQ 编码是变长的。如果(整)数值在-15到+15之间(含两个端点),用一个字符表示;超出这个范围,就需要用多个字符表示。它规定,每个字符使用6个两进制位,正好可以借用 [Base 64](http://en.wikipedia.org/wiki/Base_64) 编码的字符表。
|
||||
|
||||

|
||||

|
||||
|
||||
在这6个位中,左边的第一位(最高位)表示是否"连续"(continuation)。如果是1,代表这6个位后面的6个位也属于同一个数;如果是0,表示该数值到这6个位结束。
|
||||
|
||||

|
||||

|
||||
|
||||
这6个位中的右边最后一位(最低位)的含义,取决于这6个位是否是某个数值的VLQ编码的第一个字符。如果是的,这个位代表"符号"(sign),0为正,1为负(Source map的符号固定为0);如果不是,这个位没有特殊含义,被算作数值的一部分。
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
先看一张 CFA 证书的图片,是我家 Simba 的证书。
|
||||
|
||||

|
||||

|
||||
|
||||
不难发现 CFA 证书就像我们日常的身份证一样,虽然没有猫的照片,但猫咪的其他信息一应俱全,花色精细到色号,父母和主人的信息也都在上面。具体每个字段的意思我已经在图上打好圈圈了,每个圆圈的信息都是一个独立的信息点。
|
||||
|
||||
@@ -103,7 +103,7 @@ RAGDOOL
|
||||
|
||||
2. 访问 [CFA 官网](https://ecat.cfa.org/public/hermanonline.aspx),在 Registration Code 的地方输入证书编号
|
||||
|
||||

|
||||

|
||||
|
||||
3. 点击 “Show Report” 按钮,查看 “**Grand Scoring show records for**" 右边的猫咪信息是否匹配。
|
||||
|
||||
|
||||
@@ -10,11 +10,11 @@
|
||||
|
||||
先说一下个人赞成生骨肉喂养。
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
群里面经常看到讨论生骨肉的话题,哎呀猫猫这么小,能不能给喂肉吃啊,是不是等半岁/一岁等等各种神奇的时间节点后再喂比较好呢,也不知道这个时间节点从哪来的。
|
||||
|
||||
@@ -215,7 +215,7 @@ emmmmmmmmmm,对于这个说法无力吐槽,是否主食主要看搭配配比
|
||||
6. 可选)一口不粘锅
|
||||
7. 一个砧板
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
@@ -263,7 +263,7 @@ emmmmmmmmmm,对于这个说法无力吐槽,是否主食主要看搭配配比
|
||||
|
||||
菜谱的拟定可以复杂异常,也可以用逻辑简单思考得出结果:猫野外怎么吃,我们怎么模仿其比例。大原则永远不变:新鲜的食材,符合肉类、骨骼、内脏比例(83:7:10),足够多样的动物种类(就靠鸡鸭?万万不可)。
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
@@ -20,13 +20,13 @@
|
||||
|
||||
**Simba,中文名叫辛巴,大家应该看过狮子王希望像狮子王一样成为一个勇敢、坚强、健康的猫。**
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
@@ -34,15 +34,15 @@
|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
@@ -50,15 +50,15 @@
|
||||
|
||||
**碎星,眼眸中的光芒星星点点,好似撒下的一把星。正好和“遂心”同音,是对毛孩子的美好祈愿**
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
技术点: iOS、Web 前端、后端、Hybrid、Node 的应用、爬虫、反爬虫、后端、数据库、算法等领域。
|
||||
|
||||
偶尔记录自学经济学遇到的概念或者有趣的生活现象解读。
|
||||
后面的2个小章节主要记录自学经济学遇和养布偶猫的一些心得和经验。
|
||||
|
||||
|
||||
|
||||
@@ -20,4 +20,6 @@
|
||||
|
||||
## 反馈
|
||||
|
||||
定期更新博文。如果在查看文章的时候发现了问题可以提出 issue。(95年小双鱼,关注大前端领域,有事情可以通过[微博](http://weibo.com/u/3194053975)联系)
|
||||
定期更新博文,如果在查看文章的时候发现了问题可以提出 issue。
|
||||
关注大前端领域,喜欢乒乓球、布偶猫,杭州的小伙伴可以约乒乓球或者交流养猫心得
|
||||
有事情可以通过[微博](http://weibo.com/u/3194053975)联系
|
||||
@@ -95,6 +95,7 @@
|
||||
* [90、YYImage 框架原理,探索图片高效加载原理](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.90.md)
|
||||
* [91、二进制重排](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.91.md)
|
||||
* [92、flutter 无痕埋点](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.92.md)
|
||||
* [93、flutter 新功能引导](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter1%20-%20iOS/1.93.md)
|
||||
|
||||
|
||||
* [Chapter2 - Web FrontEnd](https://github.com/FantasticLBP/knowledge-kit/blob/master/Chapter2%20-%20Web%20FrontEnd/chapter2.md)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 58 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 35 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 57 KiB |
Reference in New Issue
Block a user