回顾, 总结

iOS程序启动过程

  1. 执行Main函数
  2. 执行UIApplication Main函数
  3. 初始化UIApplication(创建设置代理对象,进入RunLoop循环)

UIApplication

  • UIApplication是一个iOS程序的象征
  • 每个程序都只有一个UIApplication, 该对象是单例对象
  • 使用UIApplication可以做一些应用级的操作
    • applicationIconBadgeNumber: 设置提醒数字
    • networkActivityIndicatorVisible : 联网指示器是否可见

UIWindow

  • UIWindow是一种特殊的UIView, 每个App中至少有一个UIWindow
  • iOS程序启动后, 创建的第一个控件就是UIWindow, 第二创建控制器的view, 最后将view添加到UIWindow
  • 没有UIWindow, 就看不到任何UI界面
  • 当多可UIWindow存在时, 只有keyWindow才能与用户交互

多控制器

  • 为了便于管理控制器,iOS提供了两个特殊的控制器
    • UINavigationController
    • UITabBarController

UINavigationController

  • 使用步骤:
    1. 初始化
    2. 设置为UIWindowrootViewControllerUINavigationController
    3. 根据具体情况, 子控制器进行pushpop

UIStoryboardSegue

  • Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue
  • 根据跳转方式可分为两种类型
    1. 自动型:点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转
    2. 手动型:需要通过写代码手动执行Segue,才能完成界面跳转
      • [self performSegueWithIdentifier:@"login2contacts" sender:nil];
      • Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用

多控制器数据传递方式

  1. 顺传
  2. 逆传
  3. 传递方式推荐:使用代理, 或监听-发布

UITabBarController

  • 使用步骤
    1. 初始化控件
    2. 设置UIWindowrootViewController
    3. 根据具体情况, 通过addChildViewController添加子控制器

Modal

  • 除了push之外, 还有modal切换控制器
  • 任何控制器都可以使用Modal的形式展示出来
  • Modal默认效果是从下至上, 直到覆盖整个屏幕

事件

  • iOS中的事件可以分为3大类
    1. 触摸事件
    2. 加速事件
    3. 远程控制事件
  • 注意
    1. 只有继承了UIResponse的对象才能处理事件, 它们称之为响应者对象
    2. UIApplicationUIViewControllerUIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件

UITouch

  • 当用户用一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象
  • 一根手指对应一个UITouch对象
  • UITouch的作用
    1. 保存着跟手指相关的信息,比如触摸的位置、时间、阶段
    2. 当手指移动时,系统会更新同一个UITouch对象,使之能够一直保存该手指在的触摸位置
    3. 当手指离开屏幕时,系统会销毁相应的UITouch对象
  • 提示:iPhone开发中,要避免使用双击事件!

事件的产生和传递

  • 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中
  • UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口(keyWindow)
  • 主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,这也是整个事件处理过程的第一步
  • 找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理

Quartz2D

  • Quartz 2D是一个二维绘图引擎,同时支持iOSMac系统
  • Quartz 2D能完成的工作
    • 绘制图形 : 线条\三角形\矩形\圆\弧等
    • 绘制\生成图片(图像)
    • ...
  • Quartz2D的API是纯C语言的
  • Quartz2D的API来自于Core Graphics框架
  • 数据类型和函数基本都以CG作为前缀

自定义View

  • 如何利用Quartz2D绘制东西到view上?
    • 首先,得有图形上下文,因为它能保存绘图信息,并且决定着绘制到什么地方去
    • 其次,那个图形上下文必须跟view相关联,才能将内容绘制到view上面
  • 自定义view的步骤
    1. 新建一个类,继承自UIView
    2. 实现- (void)drawRect:(CGRect)rect方法,然后在这个方法中
      • 取得跟当前view相关联的图形上下文
      • 绘制相应的图形内容
      • 利用图形上下文将绘制的所有内容渲染显示到view上面

CALayer

  • iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮、一个文本标签、一个文本输入框、一个图标等等,这些都是UIView
  • UIView之所以能显示在屏幕上,完全是因为它内部的一个CALayer图层
  • 在创建UIView对象时,UIView内部会自动创建一个图层(即CALayer对象),通过UIViewlayer属性可以访问这个层
  • UIView需要显示到屏幕上时,会调用drawRect:方法进行绘图,并且会将所有内容绘制在自己的图层上,绘图完毕后,系统会将图层拷贝到屏幕上,于是就完成了UIView的显示
  • UIView本身不具备显示的功能,是它内部的图层CALayer才有显示功能
  • 通过操作CALayer对象,可以很方便地调整UIView的一些外观属性,比如
    • 阴影
    • 圆角大小
    • 边框宽度和颜色
    • ...

隐式动画

  • 每一个UIView内部都默认关联着一个CALayer,我们可用称这个LayerRoot Layer(根层)

  • 所有的非Root Layer,也就是手动创建的CALayer对象,都存在着隐式动画

  • 什么是隐式动画?

    • 当对非Root Layer的部分属性进行修改时,默认会自动产生一些动画效果
      而这些属性称为Animatable Properties(可动画属性)
  • 列举几个常见的Animatable Properties:

    • bounds:用于设置CALayer的宽度和高度。修改这个属性会产生缩放动画
    • backgroundColor:用于设置CALayer的背景色。修改这个属性会产生背景色的渐变动画
    • position:用于设置CALayer的位置。修改这个属性会产生平移动画

核心动画

  • Core Animation简介

    1. Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍。也就是说,使用少量的代码就可以实现非常强大的功能。
    2. Core Animation可以用在Mac OS XiOS平台。
    3. Core Animation的动画执行过程都是在后台操作的,不会阻塞主线程。
    4. Core Animation是直接作用在CALayer上的,并非UIView

转场动画: CATransition

  • CATransitionCAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果。iOS比Mac OS X的转场动画效果少一点
  • UINavigationController就是通过CATransition实现了将控制器的视图推入屏幕的动画效果

CADisplayLink

  • CADisplayLink是一种以屏幕刷新频率触发的时钟机制,每秒钟执行大约60次左右
  • CADisplayLink是一个计时器,可以使绘图代码与视图的刷新频率保持同步,而NSTimer无法确保计时器实际被触发的准确时间
  • 使用方法:
    1. 定义CADisplayLink并制定触发调用方法
    2. 将显示链接添加到主运行循环队列

进程

  • 进程是指在系统中正在运行的一个应用程序
  • 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内
  • 比如同时打开迅雷、Xcode,系统就会分别启动2个进程

线程

  • 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程)
  • 一个进程(程序)的所有任务都在线程中执行

线程的串行

  • 1个线程中任务的执行是串行
    • 1个线程中执行多个任务,那么只能一个一个地按顺序执行这些任务
    • 也就是说,在同一时间内,1个线程只能执行1个任务

多线程

  • 1个进程中可以开启多条线程多条线程可以并行(同时)执行不同的任务
    • 进程(车间) > 线程(车间工人)
  • 多线程技术可以提高程序的执行效率

多线程的原理

  • 同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)
  • 多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
  • 如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象
  • 思考:如果线程非常非常多,会发生什么情况?
    • CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源
    • 每条线程被调度执行的频次会降低(线程的执行效率降低)

多线程的优缺点

  • 多线程的优点
    • 能适当提高程序的执行效率
    • 能适当提高资源利用率(CPU、内存利用率)
  • 多线程的缺点
    • 创建线程是有开销的,iOS下主要成本包括:内核数据结构(大约1KB)、栈空间(子线程512KB、主线程1MB,也可以使用-setStackSize:设置,但必须是4K的倍数,而且最小是16K),创建线程大约需要90毫秒的创建时间
    • 如果开启大量的线程,会降低程序的性能
    • 线程越多,CPU在调度线程上的开销就越大
    • 程序设计更加复杂:比如线程之间的通信、多线程的数据共享

GCD

  • 什么是GCD?
    • 全称是Grand Central Dispatch,可译为牛逼的中枢调度器
    • 纯C语言,提供了非常多强大的函数
  • GCD的优势
    1. GCD是苹果公司为多核并行运算提出的解决方案
    2. GCD会自动利用更多的CPU内核(比如双核、四核)
    3. GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
    4. 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码
  • GCD中有2个核心概念

    • 任务:执行什么操作
    • 队列:用来存放任务
  • GCD的使用2个步骤

    1. 定制任务
      • 确定想做的事情
    2. 将任务添加到队列中
      • GCD会自动将队列中的任务取出,放到对应的线程中执行
      • 任务的取出遵循队列的FIFO原则:先进先出,后进后出
  • 队列的类型
    • 并发队列(Concurrent Dispatch Queue)
      • 可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)
      • 并发功能只有在异步(dispatch_async)函数下才有效
    • 串行队列(Serial Dispatch Queue)
      • 一个任务执行完毕后,再执行下一个任务

NSOperation

  • NSOperation的作用

    • 配合使用NSOperationNSOperationQueue也能实现多线程编程
  • NSOperationNSOperationQueue实现多线程的具体步骤

    1. 先将需要执行的操作封装到一个NSOperation对象中
    2. 然后将NSOperation对象添加到NSOperationQueue
    3. 系统会自动将NSOperationQueue中的NSOperation取出来
    4. 将取出的NSOperation封装的操作放到一条新线程中执行
  • NSOperation的子类

    • NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类
  • 使用NSOperation子类的方式有3种

    • NSInvocationOperation
    • NSBlockOperation
    • 自定义子类继承NSOperation,实现内部相应的方法

RunLoop

RunLoop对象

  • iOS中有2套API来访问和使用RunLoop

    1. Foundation
      • NSRunLoop
    2. Core Foundation
      • CFRunLoopRef
  • NSRunLoopCFRunLoopRef都代表着RunLoop对象

  • NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面)

RunLoop资料

苹果官方文档
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

CFRunLoopRef是开源的
http://opensource.apple.com/source/CF/CF-1151.16/

RunLoop与线程

  • 每条线程都有唯一的一个与之对应的RunLoop对象

  • 主线程的RunLoop已经自动创建好了子线程的RunLoop需要主动创建

  • RunLoop在第一次获取时创建,在线程结束时销毁

URL

  • 什么是URL

    • URL的全称是Uniform Resource Locator(统一资源定位符)
    • 通过1个URL,能找到互联网上唯一的1个资源
    • URL就是资源的地址、位置,互联网上的每个资源都有一个唯一的URL
  • URL的基本格式 = 协议://主机地址/路径

  • 协议:不同的协议,代表着不同的资源查找方式、资源传输方式
  • 主机地址:存放资源的主机(服务器)的IP地址(域名)
  • 路径:资源在主机(服务器)中的具体位置

URL中常见的协议

  • HTTP
    • 超文本传输协议,访问的是远程的网络资源,格式是http://
    • http协议是在网络开发中最常用的协议
  • file
    • 访问的是本地计算机上的资源,格式是file://(不用加主机地址)
  • mailto
    • 访问的是电子邮件地址,格式是mailto:
  • FTP
    • 访问的是共享主机的文件资源,格式是ftp://

HTTP协议的作用

  • HTTP的全称是Hypertext Transfer Protocol,超文本传输协议
  • 规定客户端和服务器之间的数据传输格式
  • 让客户端和服务器能有效地进行数据沟通

HTTP协议的特点

  • 简单快速

    • 因为HTTP协议简单,所以HTTP服务器的程序规模小,因而通信速度很快
  • 灵活

    • HTTP允许传输各种各样的数据
  • HTTP 0.9和1.0使用非持续连接

    • 限制每次连接只处理一个请求,服务器对客户端的请求做出响应后,马上断开连接,这种方式可以节省传输时间

HTTP的基本通信过程

  • 完整的http通信可以分为2大步骤
    • 请求:客户端向服务器索要数据
    • 响应:服务器返回客户端相应的数据

HTTP POST GET

  • 在HTTP/1.1协议中,定义了8种发送http请求的方法
    GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT、PATCH
  • 根据HTTP协议的设计初衷,不同的方法对资源有不同的操作方式
    • PUT :增
    • DELETE :删
    • POST:改
    • GET:查
  • 最常用的是GET和POST(实际上GET和POST都能办到增删改查)

GET和POST对比

  • GET和POST的主要区别表现在数据传递上
    • GET
      *在请求URL后面以?的形式跟上发给服务器的参数,多个参数之间用&隔开,比如
      http://ww.test.com/login?username=123&pwd=234&type=JSON
      由于浏览器和服务器对URL长度有限制,因此在URL后面附带的参数是有限制的,通常不能超过1KB

    • POST

      • 发给服务器的参数全部放在请求体中
        理论上,POST传递的数据量没有限制(具体还得看服务器的处理能力)

GET和POST的选择

  • 选择GET和POST的建议
  • 如果要传递大量数据,比如文件上传,只能用POST请求
  • GET的安全性比POST要差些,如果包含机密\敏感信息,建议用POST
  • 如果仅仅是索取数据(数据查询),建议使用GET
  • 如果是增加、修改、删除数据,建议使用POST

HTTP通信过程 - 请求

  • HTTP协议规定:1个完整的由客户端发给服务器的HTTP请求中包含以下内容
// 请求头:包含了对客户端的环境描述、客户端请求信息等
GET /minion.png HTTP/1.1   // //包含了请求方法、请求资源路径、HTTP协议版本
Host: 120.25.226.186:32812  // 客户端想访问的服务器主机地址
User-Agent: Mozilla/5.0  // 客户端的类型,客户端的软件环境
Accept: text/html, */*  // 客户端所能接收的数据类型
Accept-Language: zh-cn  // 客户端的语言环境
Accept-Encoding: gzip   // 客户端支持的数据压缩格式

// 请求体:客户端发给服务器的具体数据,比如文件数据(POST请求才会有)

HTTP通信过程 - 响应

  • 客户端向服务器发送请求,服务器应当做出响应,即返回数据给客户端
// HTTP协议规定:1个完整的HTTP响应中包含以下内容
// 响应头:包含了对服务器的描述、对返回数据的描述
HTTP/1.1 200 OK            // 包含了HTTP协议版本、状态码、状态英文名称
Server: Apache-Coyote/1.1       // 服务器的类型
Content-Type: image/jpeg        // 返回数据的类型
Content-Length: 56811       // 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间

// 响应体:服务器返回给客户端的具体数据,比如文件数据

iOS中发送HTTP请求的方案

  • 在iOS中,常见的发送HTTP请求的方案有

    • 苹果原生(自带)
    • NSURLConnection:用法简单,最古老最经典最直接的一种方案【坑比较多】
    • NSURLSession:功能比NSURLConnection更加强大,苹果目前比较推荐使用这种技术【2013推出,iOS7开始出的技术】
    • CFNetwork:NSURL*的底层,纯C语言
  • 第三方框架

    • ASIHttpRequest:外号“HTTP终结者”,功能极其强大,可惜早已停止更新
    • AFNetworking:简单易用,提供了基本够用的常用功能,维护和使用者多
    • MKNetworkKit:简单易用,维护和使用者少

NSURLConnection

  • 使用NSURLConnection发送请求的步骤
    1. 创建一个NSURL对象,设置请求路径`
    2. 传入NSURL创建一个NSURLRequest对象,设置请求头和请求体
    3. 使用NSURLConnection发送请求

JSON

  • 什么是JSON?
    • JSON是一种轻量级的数据格式,一般用于数据交互
      服务器返回给客户端的数据,一般都是JSON格式或者XML格式(文件下载除外)
// JSON的格式很像OC中的字典和数组
{"name" : "jack", "age" : 10}
{"names" : ["jack", "rose", "jim"]}
// 标准JSON格式的注意点:key必须用双引号
  • 要想从JSON中挖掘出具体数据,得对JSON进行解析
    JSON 转换为 OC数据类型

JSON解析方案

  • 在iOS中,JSON的常见解析方案有4种
    • 第三方框架:JSONKitSBJsonTouchJSON(性能从左到右,越差)
    • 苹果原生(自带):NSJSONSerialization(性能最好)

Reachability

  • 在网络应用中,需要对用户设备的网络状态进行实时监控,目的是

  • 让用户了解自己的网络状态,防止一些误会(比如怪应用无能)

  • 根据用户的网络状态进行智能处理,节省用户流量,提高用户体验

    • WIFI\3G网络:自动下载高清图片
    • 低速网络:只下载缩略图
    • 没有网络:只显示离线的缓存数据
  • 苹果官方提供了一个叫Reachability的示例程序,便于开发者检测网络状态

NSURLSession

  • NSURLSession是iOS7中新的网络接口,它与NSURLConnection是并列的。在程序在前台时,NSURLSessionNSURLConnection可以互为替代工作。注意,如果用户强制将程序关闭,NSURLSession会断掉

  • 使用步骤

    • 使用NSURLSession对象创建Task,然后执行Task
  • Task的类型

    • NSURLSessionTask
      • NSURLSessionDataTask
        • NSURLSessionUploadTask
      • NSRULSessionDownloadTask
  • 详细介绍 (别人家的博客)

NSURLSessionConfiguration

  • NSURLSessionConfiguration对象用于初始化NSURLSession对象。

  • 展开请求级别中与NSMutableURLRequest相关的可供选择的方案,我们可以看到NSURLSessionConfiguration对于会话如何产生请求,提供了相当多的控制和灵活性。从网络访问性能,到cookie,安全性,缓存策略,自定义协议,启动事件设置,以及用于移动设备优化的几个新属性,你会发现你一直在寻找的,正是NSURLSessionConfiguration

  • 会话在初始化时复制它们的配置,NSURLSession有一个只读的配置属性,使得该配置对象上的变化对这个会话的政策无效。配置在初始化时被读取一次,之后都是不会变化的。

  • 想要查看更多关于后台会话的信息,可以查看WWDC Session 204: “What’s New with Multitasking”

AFN

UIWebView

  • 什么是UIWebView?

    • UIWebView是iOS内置的浏览器控件
    • 系统自带的Safari浏览器就是通过UIWebView实现的
  • UIWebView不但能加载远程的网页资源,还能加载绝大部分的常见文件

    • html\htm
    • pdf、doc、ppt、txt
    • mp4
    • … …
  • UIWebView常用的加载资源的方法

    • - (void)loadRequest:(NSURLRequest *)request;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,079评论 4 62
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,138评论 30 470
  • • 深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生一个新的指向...
    WSGNSLog阅读 1,251评论 0 1
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,349评论 7 249
  • 把网上的一些结合自己面试时遇到的面试题总结了一下,以后有新的还会再加进来。 1. OC 的理解与特性 OC 作为一...
    AlaricMurray阅读 2,557评论 0 20