iOS高级

软件架构

  • 代码整齐,分类明确,没有common,没有core(可以有,但是必须独立,通用,不能有特殊处理)
  • 不用文档,或很少文档,就能让业务方上手
  • 思路和方法要统一,尽量不要多元
  • 没有横向依赖,万不得已不出现跨层访问
  • 对业务方该限制的地方有限制,该灵活的地方要给业务方创造灵活实现的条件
  • 易测试,易拓展
  • 保持一定量的超前性
  • 接口少,接口参数少
  • 高性能

架构分层

  • 展现层、业务层、数据层。
  • or 展现层、业务层、网络层、本地数据层
  • 也有说MVC架构,MVVM架构的,这种层次划分,主要是针对数据流动的方向而言的。
  • 为什么流行起来的是三层架构,而不是四层架构或五层架构?因为所有的模块角色只会有三种:数据管理者、数据加工者、数据展示者
  • 按照自顶向下的设计方式来设计架构
  • 先确定所有要解决的问题,先确定都有哪些模块,然后再基于这些模块再往下细化设计。然后再把这些列出来的问题和模块做好分类。分类之后不出意外大多数都是三层。如果发现某一层特别庞大,那就可以再拆开来变成四层,变成五层。

MVVM

  1. 常规的MVVM是View去触发拉取、组装数据(RAC 响应式, 类似前端)
  2. 而我的方式是组装好数据后,用数据去驱动View(数据驱动方式)
  3. 但是另外在我很多cell中,我使用的是混合方式,一方面使用ViewModel传递ID等参数,另一方面View内部根据这些参数从datasource获取详细数据,这样有一下好处
    • 能够快速的构造好需要呈现View所需的ViewModel,能够快速响应
    • 按需加载,同一时刻无需准备大量的数据,节省时间

BitCode

功能App Thinning(App瘦身)
bitcode是被编译程序的一种中间形式的代码。包含bitcode配置的程序将会在App store上被编译和链接
bitcode允许苹果在后期重新优化我们程序的二进制文件,而不需要我们重新提交一个新的版本到App store上
对应iOS,bitcode是可选的; 对于watchOS,bitcode是必须的; Mac OS不支持bitcode。
如果工程需要支持bitcode,则必要要求所有的引入的第三方库都支持bitcode

Swizzle runtime

  • 用于交换的方法,可以是对象方法、不同对象的方法、扩展的方法、不同对象的扩展的方法. 均不能为class方法、或者全局方法
  • swizzle为全局的,只用执行一次,对所有相关的都有效
  • swizzle前创建的对象,方法为原始方法,swizzle后为新方法
  • 两个方法谁dynamic,谁就可以被替换成对方,一方不为dynamic,则仍未其本身

加密

非对称加密,如RSA,生成一个公钥一个私钥,公钥给别人,双方都可以用密钥加密文件,给对方解密
摘要算法 如MD5 SHA

数值签名

对源文件使用摘要算法生成摘要,对摘要使用非对称加密算法的私钥加密
要看源文件,需要通过比对摘要一致才有权限
比对摘要,需要用公钥解密摘要

数字证书

  1. 证书签发机构CA(Certificate Authority)生成公钥密钥
  2. 开发者获得公钥,对文本进行数值签名
  3. CA对文本进行解密验证

iOS 签名,苹果提供证书,开发者使用公钥签名(code sign),iOS系统启动程序时,使用苹果的私钥进行数值签名验证,是对的就可以安装使用,否则不使用

上真机的过程中,会使用私钥,对代码进行签名
公钥会附带在mobileprovision文件中,打包进app
mobileprovision的作用 细化到app所使用的某些服务是被苹果认可的,比如APN推送,AdHoc方式发布的app或者真机调试时,会有一个列表,这个列表里面是iOS设备的UDID,功能授权列表,苹果的签名,AppId

HTTP

  • HTTP请求组成
    • Host: 目标服务器的网络地址
    • Accept: 让服务端知道客户端所能接收的数据类型,如text/html /
    • Content-Type: body中的数据类型,如application/json; charset=UTF-8
    • Accept-Language: 客户端的语言环境,如zh-cn
    • Accept-Encoding: 客户端支持的数据压缩格式,如gzip
    • User-Agent: 客户端的软件环境,可以更改该字段为自己客户端的名字,比如QQ music v1.11,比如浏览器Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Maxthon/4.5.2
    • Connection: keep-alive,该字段是从HTTP 1.1才开始有的,用来告诉服务端这是一个持久连接,“请服务端不要在发出响应后立即断开TCP连接”
    • Content-Length: body的长度,如果body为空则该字段值为0。该字段一般在POST请求中才会有
    • Cookie: 记录者用户信息的保存在本地的用户数据,如果有会被自动附上。iOS中NSHTTPCookieStorage是一个单例,NSURLRequest会自动记录,给所访问的URL上设置cookie
  • HTTP状态
    • 1XX:信息提示。不代表成功或者失败,表示临时响应,比如100表示继续,101表示切换协议
    • 2XX: 成功
    • 3XX: 重定向
    • 4XX:客户端错误,很有可能是客户端发生问题,如404表示未找到文件,说明你的URL是有问题的,服务器机子上该目录是没有该文件的;414URL太长
    • 5XX: 服务器错误,比如504网关超时
  • HTTP版本
    • 与1.1之前的版本相比,1.1做了以下性能上的提升
      • 增加请求头跟响应头
      • 支持持久连接。(Connection为keep-alive)告知服务端不要在完成响应后立即释放连接
      • HTTP是基于TCP的,在HTTP 1.1中一次TCP连接可以处理多次HTTP请求
      • 客户端不同请求之间是异步的。下一个请求不必等到上一个请求回来后再发出,而可以连续发出请求,有点类似多线程的异步处理。
    • HTTP 2.0
      • 1.1版本有的特性2.0都具备,也使用相同的API。
      • 2.0将只用于https网址。

        HTTPS

  • 是对称加密
  • 对称密钥是客户端根据服务端返回的公钥生成的
  • 双方今后使用这两把钥匙通信

TCP UDP Socket HTTP

  • TCP为传输控制层协议,为面向连接、可靠的、点到点的通信;
  • UDP为用户数据报协议,非连接的不可靠的点到多点的通信;
  • TCP侧重可靠传输,UDP侧重快速传输

iOS 中Socket连接库CocoaAsyncSocket

iOS性能调优

  • Instuments
    • Activity Monitor 查看所有的进程,以及进程的内存、cpu使用百分比等数据等
    • Allocations 定位和找出减少内存使用的方式:
      1. 对象A申请了内存空间,之后再也没用过对象A(Leaked Memory内存泄漏)
      2. 不断地申请内存空间导致的内存泄漏,(Abandoned Momory)
    • Core Animation
      1. 查看FPS
      2. 查看Color Blended Layers(混合过度绘制)
        • View设置不透明背景色,opaque = true(默认)
        • label默认背景色为clear,设置颜色,label中文有阴影,设置.layer.masksToBounds = true,
        • ImageView的image不要alpha
      3. 离屏渲染
        • 单独cornerRadius = true 或 layer.masksToBounds = true不会

results matching ""

    No results matching ""