Kevinlma的博客

物来顺应,未来不迎,当时不杂,既过不恋

0%

操作步骤

静态库一般是Fat library, 先查看静态库都包含哪些CPU架构。

1
2
>> lipo -info libSGTTSLib.a
Architectures in the fat file: libSGTTSLib.a are: i386 armv7 armv7s x86_64 arm64

模拟机是x86_64、真机现在用的是arm64和armv7

先拆分出每个架构对应的lib,以arm64为例:

阅读全文 »

项目中有时会碰到与block有关的疑难问题,要解决的话对block的原理需要有一个较清晰的认识。虽然网上介绍很多,不过还是自己尝试分析一次记忆更深刻一些。

block类型

  • 非arc工程中,block分为三种,stack、heap和global。
    stack的block在生命周期结束时就会释放(花括号)
    heap的只有当引用计数为0时才会被释放
  • arc的工程中,stack的block会自动转化为heap。
  • block是一个伪对象,针对stack的block, 对其进行retain,release没有效果。所以在非arc工程中,要讲block作为参数外传,赋值时,必须调用copy
  • 在arc下,只有block赋值给了一个strong类型,或者是作为参数向外传,都会自动变为堆类型block

Block的类型

  • 在 ARC 中,捕获外部了变量的 block 的类会是 __NSMallocBlock__ 或者 __NSStackBlock__,如果 block 被赋值给了某个变量在这个过程中会执行 _Block_copy 将原有的 __NSStackBlock__ 变成 __NSMallocBlock__;但是如果 block 没有被赋值给某个变量,那它的类型就是 __NSStackBlock__;没有捕获外部变量的 block 的类会是 __NSGlobalBlock__ 即不在堆上,也不在栈上,它类似 C 语言函数一样会在代码段中。
  • 在非 ARC 中,捕获了外部变量的 block 的类会是 __NSStackBlock__,放置在栈上,没有捕获外部变量的 block 时与 ARC 环境下情况相同
阅读全文 »

AFURLSessionManager

发起请求的核心类。通过 AFURLSessionManager 来创建并定制一个request。

主要的成员类

一个Manager里持有着一些负责具体功能的类。

  • NSURLSession
  • NSOperationQueue
  • AFURLResponseSerialization
  • AFSecurityPolicy
  • AFNetworkReachabilityManager
  • 存储不同类型的Session Task的容器,比如tasks, dataTasks, uploadTasks, downloadTasks
阅读全文 »

使用pipe的背景

项目中的测试包以及发布包的构建是通过Jenkins来进行的,使用的是自由风格的任务,但主要的构建任务是写在一系列的python脚本里的。比如一个Release的构建任务,基本就是设置好git的仓库地址,账号密码,然后在构建的一栏里选择执行shell, 然后填上一句类似python /.../build.py -type adhoc这样的语句就行。其中build.py是从项目初期的一些自动化构建脚本整合而来的,涉及的内容包括增加build号, 构建ipa, 上传测试包, 上传符号, 发邮件等一系列操作。

这种方式虽然使用起来很简单,但是也逐渐暴露出一些弊病,比如

  1. 涉及到的所有步骤都是包含在build.py及其子调用里。如果想只进行其中某一个步骤,或者构建失败后,想从中间某个步骤接着重新够建,这是做不到的。必须重头再构建一遍。
  2. 构建错误不好排查,只能从整体的构建日志里去查,看看是哪一步出错了。
  3. Jenkins界面上也不太友好。一个构建步骤开始后,基本只能等着结果或者出错,或者成功。无法从界面上直观的看出进行到什么阶段,以及花费了多长时间

所以基于上面的问题,就对构建方式进行了改造,同时熟悉了一次Jenkins的pipe机制

阅读全文 »

基本概念

涉及的算法

  1. 非对称加密算法,一般是RSA加密算法。一对私钥和公钥。用私钥加密后,只能用公钥解密。知道公钥无法破解出私钥。
  2. 摘要算法,也是哈希算法。相同的数据,哈希值肯定相同。哈希值不同,数据肯定不同。 根据哈希值无法反推出数据是什么

签名算法:

发送方:

阅读全文 »

简单集成flutter到已有项目

创建Flutter Module

flutter的集成可以是创建一个 新的flutter app 的方式,也可以是以创建一个module的方式,集成到一个已有的App中。一般项目都会通过第二种方式,来逐步进行Native和Flutter代码的混编。这里也主要是采用第二种方式,来一步步演示集成步骤。

这种集成方式要求flutter侧的代码是通过module的方式来创建,所以先创建一个示例的module。运行下面创建代码

阅读全文 »

原理

按照固定的时间间隔,定时对线程中的调用堆栈进行采样,获取一个sample. 之后统计在这一时段内,某个方法出现在sample中次数。以此来表示该函数的运行情况

所以Long RunningRepeatitive and Fast running. 他们很可能被采样同样多的次数。

面板概念

阅读全文 »

App build step

  1. 预处理,将宏替换,生成ASCIi中间文件
  2. 运行编译器,将中间文件生成汇编中间文件
  3. 运行汇编器,将汇编文件翻译生成目标文件 .o
  4. 运行链接器,将目标文件组合成一个可执行文件

Mach-O Terminology

File Types:

  • Executable – Main binary for application
  • Dylib – Dynamic library (.dylib, .dll, .so)
  • bundle – Dylib that cannot be linked, only dlopen(), e.g. plug-ins
阅读全文 »

Problem

公司的某台测试机启动时间变的非常的慢,甚至达到10秒左右。但是其他大部分手机都没有问题。所以对这个手机进行了一番调查,发现是openUDID这个常用的第三方库拖慢了启动时间,于是做了一些优化,并做个总结。

History

ios5之前,开发者可以直接访问 UDID(unique device identifier)。比较准确

ios5系统,苹果禁止开发者获取UDID。各家公司开始自研相应的替代方案。所以出现了很几种方案。

阅读全文 »