个人总结------高级知识点必会
高级知识点之必会
共44题
1、OC中创建线程的方法是什么?假设指定在主线程中执行代码?怎样延时执行代码。【难度系数★★】
1)创建线程的方法
NSThread
NSOperationQueue和NSOperation
GCD
2)主线程中执行代码
[self performSelectorOnMainThread:withObject: waitUntilDone:];
[self performSelector: onThread:[NSThreadmainThread] withObject: waitUntilDone:];
dispatch_async(dispatch_get_main_queue(),^{
});
3)延时执行
double delayInSeconds = 2.0;
dispatch_time_t popTime =dispatch_time(DISPATCH_TIME_NOW,
(int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime,dispatch_get_main_queue(), ^(void){
});
[self performSelector: withObject:afterDelay:];
[NSTimer scheduledTimerWithTimeInterval:target: selector: userInfo: repeats:];
2、多线程是什么【难度系数★】
多线程是个复杂的概念,按字面意思是同步完毕多项任务,提高了资源的使用效率。从硬件、操作系统、应用软件不同的角度去看,多线程被赋予不同的内涵。对于硬件。如今市面上多数的CPU都是多核的。多核的CPU运算多线程更为出色;从操作系统角度,是多任务。如今用的主流操作系统都是多任务的,能够一边听歌、一边写博客;对于应用来说。多线程能够让应用有更快的回应,能够在网络下载时,同一时候响应用户的触摸操作。
在iOS应用中。对多线程最初的理解。就是并发,它的含义是原来先做烧水。再摘菜。再炒菜的工作,会变成烧水的同一时候去摘菜,最后去炒菜
3、iOS 中的多线程【难度系数★★】
iOS中的多线程。是Cocoa框架下的多线程,通过Cocoa的封装,能够让我们更为方便的使用线程。做过C++的同学可能会对线程有很多其它的理解,比方线程的创立。信号量、共享变量有认识。Cocoa框架下会方便非常多。它对线程做了封装。有些封装,能够让我们创建的对象,本身便拥有线程。也就是线程的对象化抽象,从而降低我们的project。提供程序的健壮性。
GCD是(Grand Central Dispatch)的缩写 。从系统级别提供的一个易用地多线程类库,具有执行时的特点,能充分利用多核心硬件。GCD的API接口为C语言的函数,函数參数中多数有Block。关于Block的使用參看这里。为我们提供强大的“接口”,对于GCD的使用參见本文
NSOperation与Queue
NSOperation是一个抽象类,它封装了线程的细节实现,我们能够通过子类化该对象,加上NSQueue来同面向对象的思维,管理多线程程序。详细可參看这里:一个基于NSOperation的多线程网络訪问的项目。
NSThread
NSThread是一个控制线程执行的对象,它不如NSOperation抽象,通过它我们能够方便的得到一个线程。并控制它。但NSThread的线程之间的并发控制,是须要我们自己来控制的。能够通过NSCondition实现。
在Cocoa的框架下,通知、Timer和异步函数等都有使用多线程,(待补充).
4、在项目什么时候选择使用GCD。什么时候选择NSOperation?
【难度系数★★】
项目中使用NSOperation的长处是NSOperation是对线程的高度抽象。在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路。是具有面向对象的长处(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
项目中使用GCD的长处是GCD本身非常简单、易用,对于不复杂的多线程操作。会节省代码量,而Block參数的使用。会是代码更为易读,建议在简单项目中使用
5、NSThread,NSOperation,GCD【难度系数★★】
NSThread,NSOperation,GCD是IOS中使用多线程的三种方式之中的一个。
他们各有优缺点。抽象层次是从低到高的,抽象度越高的使用越简单。
NSThread,缺点:须要自己维护线程的生命周期和线程的同步和相互排斥。可是这些都须要耗费系统的资源。
长处:比其它两个更轻。
NSOperation,长处:不须要自己管理线程的生命周期和线程的同步和相互排斥等。
仅仅是须要关注自己的业务逻辑处理,须要和NSOperationQueue一起使用。
GCD,是Apple开发的一个多核编程解决方法,长处:比前面两者更高效更强大
6、NSRunLoop和NSOperationQueue【难度系数★★】
NSRunLoop 是全部要监视的输入源和定时源以及要通知的注冊观察者的集合.用来处理诸如鼠标。键盘事件等的输入源。每一个线程拥有自己的RunLoop有系统自己主动创建。
你不应该自己去创建,仅仅能获取。
一般不会用NSRunLoop,由于它不是线程安全的。
一般都用CFRunLoop,这个是线程安全的。是一种消息处理模式,我们一般不用进行处理。
NSOperationQueue时一个管理NSOperation的队列。我们会把NSOperation放入queue中进行管理
7、加入手势的方式(gesture和touches事件)【难度系数★★】
1)自己重载实现touchMoved,touchBegin。touchEnd。touchCanceled事件。
2)通过UIGestureRecongnizer加入AddGestureRecognier事件。
该方式方便加入一些诸如点击,双击,拖动等主要的手势事件
8、经常使用的开源框架【难度系数★】
网络框架: AFNetworking,coocaHttpServer等。
进度条:SVprogressHUD,MBprogressHUD,
工具类:SSToolKit等。
分享类:ShareKit等
日志框架:log4j,cocoalumberJack 等
9、常见的加解密方式(rsa,aes,md5)【难度系数★★】
常见的加解密方式有:
RSA:基于公钥和私钥的非对程加密算法。适用范围广。
AES:是一种对程加密的流行方式。
加密涉及矩阵运算。
MD5:将随意长度的“字节串”变换成一个128bit的大整数,而且它是一个不可逆的字符串变换算法
10、我们说的oc是动态执行时语言是什么意思?【难度系数★★★】
多态。 主要是将数据类型的确定由编译时,推迟到了执行时。
这个问题事实上浅涉及到两个概念。执行时和多态。
简单来说,执行时机制使我们直到执行时才去决定一个对象的类别,以及调用该类别对象指定方法。
多态:不同对象以自己的方式响应同样的消息的能力叫做多态。意思就是假设生物类(life)都用有一个同样的方法-eat;
那人类属于生物,猪也属于生物。都继承了life后。实现各自的eat,可是调用是我们仅仅需调用各自的eat方法。
也就是不同的对象以自己的方式响应了同样的消息(响应了eat这个选择器)。
因此也能够说,执行时机制是多态的基础?
11、什么是推送消息?
【难度系数★】
推送通知更是一种技术。
简单点就是client获取资源的一种手段。
普通情况下。都是client主动的pull。
推送则是server端主动push。
12、什么是沙盒模型?哪些操作是属于私有api范畴?【难度系数★★】
某个iphoneproject进行文件操作有此project相应的指定的位置。不能逾越。
iphone沙箱模型的有四个文件夹documents,tmp,app,Library,永久数据存储一般放documents文件夹,得到模拟器的路径的可使用NSHomeDirectory()方法。Nsuserdefaults保存的文件在tmp文件夹里
13、HTTP协议中。POST和GET的差别是什么?【难度系数★★】
1).GET 方法
GET 方法提交数据不安全。数据置于请求行,client地址栏可见;
GET 方法提交的数据大小有限
GET 方法不能够设置书签
2).POST 方法
POST 方法提交数据安全,数据置于消息主体内。client不可见
POST 方法提交的数据大小没有限制
POST 方法能够设置书签
14、GCD有哪几种Queue?你自己建立过串行的Queue吗?背后的线程模型是什么样的?【难度系数★★】
globalQueue和mainQueue
建立过,欢迎页完毕一系列的动画后,弹出登录框
欢迎页动画并行执行,前者和后者串行执行
主队列dispatch_main_queue();串行更新UI
全局队列dispatch_global_queue();并行。四个优先级:background,low,default,high
自己定义队列dispatch_queue_t queue;能够自己定义是并行DISPATCH_QUEUE_CONCURRENT或DISPATCH_QUEUE_SERIAL
15、TCP和UDP有什么差别?【难度系数★★】
1)TCP---传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和server彼此交换数据前,必须先在两方之间建立一个TCP连接。之后才干数据传输。TCP提供超时重发,丢弃反复数据,检验数据。流量控制等功能,保证数据能从一端传到还有一端。
2)UDP---用户数据报协议。是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它仅仅是把应用程序传给IP层的数据报发送出去。可是并不能保证它们能到达目的地。
由于UDP在数据传输报前不用在客户和server之间建立一个连接。且没有超时重发等机制,故而传输速度非常快
3)TCP是面向连接的,建立连接须要经历三次握手,保证数据正确性和数据顺序
UDP是非连接的协议,传送数据受生成速度。传输带宽等限制,可能造成丢包
UDP一台服务端能够同一时候向多个client传输信息
TCP报头体积更大。对系统资源要求很多其它
16、说说响应链【难度系数★★★】
事件响应链。包含点击事件,画面刷新事件等。
在视图栈内从上至下,或者从下之上传播。
能够说点事件的分发,传递以及处理。详细能够去看下touch事件这块。
由于问的太抽象化了
严重怀疑题目出到越后面就越笼统。
能够从责任链模式。来讲通过事件响应链处理。其拥有的扩展性
17、http和scoket通信的差别。【难度系数★★★】
http是client用http协议进行请求,发送请求时候须要封装http请求头,并绑定请求的数据。server一般有webserver配合(当然也非绝对)。http请求方式为client主动发起请求,server才干给响应。一次请求完毕后则断开连接,以节省资源。
server不能主动给client响应(除非採取http长连接 技术)。
iphone主要使用类是NSUrlConnection。
scoket是client跟server直接使用socket“套接字”进行连接,并没有规定连接后断开,所以client和server能够保持连接通道,两方都能够主动发送数据。一般在游戏开发或股票开发这样的要求即时性非常强而且保持发送数据量比較大的场合使用。主要使用类是CFSocketRef。
18、什么是push。【难度系数★★】
client程序留下后门port。client总是监听针对这个后门的请求,于是 server能够主动像这个port推送消息。
19、简述内存分区情况【难度系数★★★】
1).代码区:存放函数二进制代码
2).数据区:系统执行时申请内存并初始化,系统退出时由系统释放。存放全局变量、静态变量、常量
3).堆区:通过malloc等函数或new等操作符动态申请得到,需程序猿手动申请和释放
4).栈区:函数模块内申请,函数结束时由系统自己主动释放。
存放局部变量、函数參数
20、runloop和线程有什么关系?【难度系数★★★】
总的说来。Run loop,正如其名。loop表示某种循环,和run放在一起就表示一直在执行着的循环。实际上,run loop和线程是紧密相连的,能够这样说run loop是为了线程而生,没有线程,它就没有存在的必要。
Run loops是线程的基础架构部分, Cocoa 和 CoreFundation 都提供了 run loop 对象方便配置和管理线程的 run loop (下面都以 Cocoa 为例)。每一个线程。包含程序的主线程( main thread )都有与之相应的 run loop 对象。
21、dispatch_barrier_async的作用是什么?【难度系数★★★】
1)在并行队列中。为了保持某些任务的顺序,须要等待一些任务完毕后才干继续进行,使用 barrier
来等待之前任务完毕。避免数据竞争等问题。
dispatch_barrier_async 函数会等待追加到ConcurrentDispatch Queue并行队列中的操作全部执行完之后,然后再执行 dispatch_barrier_async 函数追加的处理。等 dispatch_barrier_async 追加的处理执行结束之后,ConcurrentDispatch
Queue才恢复之前的动作继续执行。
2)打个比方:比方你们公司周末跟团旅游。高速歇息站上,司机说:大家都去上厕所。速战速决,上完厕所就上高速。超大的公共厕所,大家同一时候去,程序猿非常快就结束了,但程序媛就可能会慢一些,即使你第一个回来。司机也不会出发。司机要等待全部人都回来后,才干出发。
dispatch_barrier_async 函数追加的内容就如同 “上完厕所就上高速”这个动作。
(注意:使用 dispatch_barrier_async ,该函数仅仅能搭配自己定义并行队列 dispatch_queue_t 使用。
不能使用: dispatch_get_global_queue ,否则 dispatch_barrier_async 的作用会和 dispatch_async 的作用一模一样。 )
22、苹果为什么要废弃dispatch_get_current_queue
?【难度系数★★】
dispatch_get_current_queue
easy造成死锁
23、iOS平台怎么做数据的持久化?coredata和sqlite有无必定联系【难度系数★★】
(1)属性列表NSString,NSArray,NSDictionary,NSData调用writeToFile方法写本地
(2)NSKeyedAarchiver归档,解档来保存数据
(3)数据库sqlite的第三方FMDB保存数据
(4)coredata保存数据
(5)coredata底层能够用sqlite来实现,coredata相当于封装了sqlite的 底层实现,给用户一个直接调用的接口。
24、Sqlite和coredata的差别:【难度系数★★】
简单的答复 coreData提供ORM(Object Relationships Mapping)解决方式,能直接生成相应的model对象文件,而且封装了一些底层操作,简化了使用,而sqlite要使用c调用相应的api。并进行一些底层的封装操作。且model对象文件要自己写过。代码量会稍大一些。其它感觉差不太多
详细来说有下面几点:
(1)使用方便性。实际上,一个成熟的project中一定是对数据持久化进行了封装的。因此底层使用的究竟是core data还是sqlite,不应该被业务逻辑开发人员关心。因此,即使习惯写SQL查询的人,也应该避免在业务逻辑中直接编写SQL语句。
(2)存储性能,在写入性能上。由于都是使用的sqlite格式作为磁盘存储格式,因此其性能是一样的。假设你认为用core data写的慢,非常可能是你用sqlite的时候写的每条数据的内容没有core data时多,或者是你批量写入的时候每写入一条就调用了一次save。
(3)查询性能,core data由于要兼容多种后端格式,因此查询时。其可用的语句比直接使用sqlite少,因此有些fetch实际上不是在sqlite中执行的。但这样未必会降低查询效率。
由于iPhone的flash memory速度还是非常快的。我的经验是大部分时候。在内存不是非常紧张时,直接fetch一个entity的全部数据然后在内存中做filter往往比使用predicate在fetch时过滤更快。假设你觉的查询慢。非常可能是查询方式有问题,能够把core data的debug模式打开,看一下究竟执行了多少SQL语句。相信当中大部分是能够通过改写core data的调用方式避免的。
(4)core data的一个比較大的痛点是多人合作开发的时候。管理coredata的模型须要非常小心,尤其是合并的时候。他的data model是XML格式的,手动resolve比較烦心。
(5)core data还有其它sql所不具备的长处。比方对undo的支持,多个context实现sketchbook相似的功能。
为ManagedObject优化的row cash等。
另外core data是支持多线程的,但须要threadconfinement的方式实现,使用了多线程之后能够最大化的防止堵塞主线程。
25、谈谈对多线程的理解【难度系数★★】
多线程能够实现一个app中同一时候执行多个代码路径。
多线程的优势是
1)多个线程可提高app的感知响应。
2)多个线程可提高应用程序在多核系统上的实时性能。
多线程的弊端
1)多线程带来长处的同一时候也会添加代码的复杂度,每一个线程须要和其它线程协调其行为。以防止它破坏应用程序的状态信息。由于多线程共享内存空间,訪问同样的数据结构,假设有两个线程试图同一时候处理同样的数据结构,一个线程有可能覆盖还有一个线程的修改导致破坏该数据结构。
2)多线程速度快的同一时候添加了内存消耗和CPU占用
26、怎样管理数据的安全性【难度系数★★】
參数post传递。keyword段加密处理
iOS数据加密方式有:
md5加密
NSString*md5 = [CJMD5 md5HexDigest:password];
aes加密
NSString*encryptedData = [AESCrypt encrypt:userName password:password];//加密
NSString *message = [AESCrypt decrypt:encryptedData password:password];//解密
base64加密
+(NSString*)encodeBase64String:(NSString *)input;
+(NSString*)decodeBase64String:(NSString *)input;
+(NSString*)encodeBase64Data:(NSData *)data;
+(NSString*)decodeBase64Data:(NSData *)data;
27、远程推送的工作机制【难度系数★★】
(1)苹果设备注冊远程通知,从苹果请求deviceToken
(2)苹果设备向业务逻辑server上传deviceToken值,区分设备
(3)业务逻辑server向苹果发送推送通知消息请求,
(4)苹果依据deviceToken区分不同的手机设备推送给指定的iOSclient。
28、多线程GCD,有三个事件abc,想要处理完ab后再执行c。要怎么做【难度系数★★★】
(1)比較笨的一种方法,abc皆顺序执行dispatch_async(dispatch_get_global_queue(0, 0), ^{
//事件a
//事件b
//事件c
});
(2)利用分组操作,ab在不同线程执行。最后都执行完了后再执行c
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
//事件a
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
//事件b
});
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
//事件c
});
(3)利用基础知识,自己定义实现此功能。相当于自己实现了分组的底层
__block int count =0;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//事件a
count++;
if (count == 2)
{
//事件c
}
});
dispatch_async(dispatch_get_global_queue(0, 0), ^{
//事件b
count++;
if (count == 2)
{
//事件c
}
});
29、单例是线程安全的吗?【难度系数★★】
(1)单例在之前的创建过程中是
@synchronized(self)
{
if (!_configs)
{
_configs = [[XRConfigs alloc] init];
}
}
加了同步代码,所以同一时刻仅仅会有一个线程调用创建代码,所以是线程安全的
(2)单比如今的创建过程是
static dispatch_once_tonceToken;
dispatch_once(&onceToken,^{
_configs = [[XRConfigs alloc] init];
});
return _configs;
用GCD来控制他仅仅执行一次,所以也是线程安全的
(3) 单例中方法假设想要线程安全能够用 dispatch_queue_create命令来创建一个单独的线程。然后单例中全部方法都在这个串行线程中执行。这样能够保证执行方法是线程安全的。
30、写出异步载入复数网络图片的原理比方SDWebImage【难度系数★★★★】
SDWebImage 载入图片的流程:
1.入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示。然后 SDWebImageManager 依据 URL 開始处理图片。
2.进入SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载queryDiskCacheForKey:delegate:userInfo:.
3.先从内存图片缓存查找是否有图片。假设内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到SDWebImageManager。
4.SDWebImageManagerDelegate 回调webImageManager:didFinishWithImage: 到UIImageView+WebCache 等前端展示图片。
5.假设内存缓存中没有,生成 NSInvocationOperation 加入到队列開始从硬盘查找图片是否已经缓存。
6.依据 URLKey 在硬盘缓存文件夹下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调notifyDelegate:。
7.假设上一操作从硬盘读取到了图片,将图片加入到内存缓存中(假设空暇内存过小,会先清空内存缓存)。SDImageCacheDelegate回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。
8.假设从硬盘缓存文件夹读取不到图片,说明全部缓存都不存在该图片,须要下载图片,回调imageCache:didNotFindImageForKey:userInfo:。
9.共享或又一次生成一个下载器 SDWebImageDownloader 開始下载图片。
10.图片下载由 NSURLConnection 来做。实现相关 delegate 来推断图片下载中、下载完毕和下载失败。
11.connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度载入效果。
12.connectionDidFinishLoading: 数据下载完毕后交给 SDWebImageDecoder 做图片解码处理。
13.图片解码处理在一个 NSOperationQueue 完毕。不会拖慢主线程 UI。假设有须要对下载的图片进行二次处理。最好也在这里完毕。效率会好非常多。
14.在主线程notifyDelegateOnMainThreadWithInfo: 宣告解码完毕,imageDecoder:didFinishDecodingImage:userInfo:回调给 SDWebImageDownloader。
31、获取项目根路径,并在其下创建一个名称为userData的文件夹。【难度系数★】
NSString*userDataPath = [NSHomeDirectory() stringByAppendingString:@"/userData"];
[[NSFileManager defaultManager] createDirectoryAtPath:userDataPathwithIntermediateDirectories:nil attributes:nil error:nil];
简单来说
[NSFileManager defaultManager]调用它的createDirectoryAtPath的方法来创建文件夹
32、XML、HTML语言差别【难度系数★★】
1)XML与HTML的设计差别是:XML的核心是数据,其重点是数据的内容。而HTML 被设计用来显示数据,其重点是数据的显示。
2)XML和HTML语法差别:HTML的标记不是全部的都须要成对出现。XML则要求全部的标记必须成对出现;HTML标记不区分大写和小写,XML则 大小敏感,即区分大写和小写。
33、HTTP协议详细解释【难度系数★★★】
HTTP是一个属于应用层的面向对象的协议,由于其简捷、高速的方式,适用于分布式超媒体信息系统。
眼下在WWW中使用的是HTTP/1.0的第六版。HTTP/1.1的规范化工作正在进行之中。
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本号中给出一种持续连接的机制,绝大多数的Web开发。都是构建在HTTP协议之上的Web应用。
HTTP协议的主要特点可概括例如以下:
1.支持客户/server模式。
2.简单高速:客户向server请求服务时,仅仅需传送请求方法和路径。请求方法经常使用的有GET、HEAD、POST。
每种方法规定了客户与server联系的类型不同。由于HTTP协议简单,使得HTTPserver的程序规模小,因而通信速度非常快。
3.灵活:HTTP同意传输随意类型的数据对象。
正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接仅仅处理一个请求。
server处理完客户的请求,并收到客户的应答后,即断开连接。採用这样的方式能够节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。
缺少状态意味着假设兴许处理须要前面的信息。则它必须重传,这样可能导致每次连接传送的数据量增大。还有一方面,在server不须要先前信息时它的应答就较快。
34、HTTP三次握手【难度系数★★★】
TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说。在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才干建立起来。我们来看看这三次对话的简单过程:1.主机A向主机B发出连接请求数据包。2.主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送。一个在接收。协调工作)的数据包。3.主机A再发出一个数据包确认主机B的要求同步:“我如今就发。你接着吧。”。这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
第一次握手:client发送syn包(syn=j)到server,并进入SYN_SEND状态。等待server确认;
第二次握手:server收到syn包,必须确认客户的SYN(ack=j+1),同一时候自己也发送一个SYN包(syn=k),即SYN+ACK包。此时server进入SYN_RECV状态;
第三次握手:client收到server的SYN+ACK包。向server发送确认包ACK(ack=k+1),此包发送完毕,client和server进入ESTABLISHED状态。完毕三次握手。
35、利用Socket建立网络连接的步骤【难度系数★★★】
建立Socket连接至少须要一对套接字,当中一个执行于client。称为ClientSocket ,还有一个执行于server端,称为ServerSocket 。
套接字之间的连接过程分为三个步骤:server监听。client请求,连接确认。
1。
server监听:server端套接字并不定位详细的client套接字。而是处于等待连接的状态。实时监控网络状态。等待client的连接请求。
2。client请求:指client的套接字提出连接请求,要连接的目标是server端的套接字。
为此。client的套接字必须首先描写叙述它要连接的server的套接字,指出server端套接字的地址和port号。然后就向server端套接字提出连接请求。
3。
连接确认:当server端套接字监听到或者说接收到client套接字的连接请求时,就响应client套接字的请求,建立一个新的线程。把server端套接字的描写叙述发给client,一旦client确认了此描写叙述,两方就正式建立连接。而server端套接字继续处于监听状态,继续接收其它client套接字的连接请求。
36、执行时你是怎么理解的。怎么用的?
【难度系数★★★】
OC Runtime事实上是一个 Runtime 库。基本上用 C 和汇编写的,这个库使得 C 语言有了面向对象的能力(脑中浮现当你乔帮主參观了施乐帕克的 SmallTalk 之后嘴角一抹浅笑)。这个库做的事前就是载入类的信息,进行方法的分发和转发之类的。OC是一种面向runtime(执行时)的语言,也就是说,它会尽可能地把代码执行的决策从编译和链接的时候,推迟到执行时。这给程序猿写代码带来非常大的灵活性。比方说你能够把消息转发给你想要的对象。或者随意交换一个方法的实现之类的。这就要求runtime能检測一个对象能否对一个方法进行响应,然后再把这种方法分发到相应的对象去。我们拿 C 来跟 ObjC 对照一下。
在 C 语言里面,一切从 main 函数開始。程序猿写代码的时候是自上而下地,一个 C 的结构体或者说类吧,是不能把方法调用转发给其它对象的。这个问题事实上浅涉及到两个概念。执行时和多态。 简单来说,执行时机制使我们直到执行时才去决定一个对象的类别,以及调用该类别对象指定方法。 多态:不同对象以自己的方式响应同样的消息的能力叫做多态。意思就是假设生物类(life)都用有一个同样的方法-eat; 那人类属于生物,猪也属于生物,都继承了life后。实现各自的eat,可是调用是我们仅仅需调用各自的eat方法。
也就是不同的对象以自己的方式响应了同样的消息(响应了eat这个选择器。因此也能够说,执行时机制是多态的基础。比方KVO中我们就用了。
37、消息推送是怎么现实的?【难度系数★★】
iOS消息推送的工作机制能够简单的用下图来概括:
Provider是指某个iPhone软件的Pushserver,APNS是ApplePush Notification Service的缩写,是苹果的server。
上图能够分为三个阶段:
第一阶段:应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注冊Push服务的iPhone列表中,查找有相应标识的iPhone。并把消息发送到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序。而且依照设定弹出Push通知。
从上图我们能够看到:
1、应用程序注冊消息推送。
2、iOS从APNS Server获取device token,应用程序接收device token。
3、应用程序将device token发送给PUSH服务端程序。
4、服务端程序向APNS服务发送消息。
5、APNS服务将消息发送给iPhone应用程序。
38、依据什么确定要开启线程数?普通情况下开启几条?【难度系数★★】
一般不须要管理线程数量。程序开放时是针对队列开发的。向队列加入操作就能够了。详细的线程数量由底层的线程池管理,开启线程的数量通常会依据用户的网络情况决定。
WIFI一般5-6条,3G一般2-3条。
39、分析json、xml的差别?json、xml解析方式的底层是怎样处理的?【难度系数★★★★】
一、关于轻量级和重量级
轻量级和重量级是相对来说的,那么XML相对于JSON的重量级体如今哪呢?
应该体如今解析上,XML眼下设计了两种解析方式:DOM和 SAX。
<1>.DOM
DOM须要把XML文件整个读入内存;
<2>.SAX
SAX不须要整个读入文档就能够对解析出的内容进行处理,是一种逐步解析的方法。程序也能够随时终止解析。
这样,一个大的文档就能够逐步的、一点一点的展现出来。所以SAX适合于大规模的解析。
这一点。JSON眼下是做不到得。
所以。JSON和XML的轻/重量级的差别在于:
JSON仅仅提供总体解析方案,而这样的方法仅仅在解析较少的数据时才干起到良好的效果;
XML提供了对大规模数据的逐步解析方案。这样的方案非常适合于对大量数据的处理。
二、关于数据格式编码及解析难度
1、在编码方面。
虽 然XML和JSON都有各自的编码工具,可是JSON的编码要比XML简单。即使不借助工具,也能够写出JSON代码。但要写出好的XML代码就有点困 难;与XML一样,JSON也是基于文本的,且它们都使用Unicode编码,且其与数据交换格式XML一样具有可读性。
主观上来看,JSON更为清晰且冗余更少些。
JSON站点提供了对JSON语法的严格描写叙述,仅仅是描写叙述较简短。从总体来看。XML比較适合于标记文档,而JSON却更适于进行数据交换处理。
JSON声称相对XML有很多长处,包含:
easy阅读
解析速度更快
占用空间更少
虽然easy阅读是非常难衡量的一点,但其它两点是非常显然的。
非常easy看出,存储同样的信息JSON确实须要更少的空间。高速浏览一下JSON的站点后。你会发现几个比較这两种格式的样例。从页面上能够非常easy的看出: 描写叙述同样的信息JSON比XML少占用非常多的空间。
比如:第一个样例(词汇表结构)存储为XML须要502个字符,而存储为JSON仅仅需345字符(大约 少占30%的空间)。
对于“解析速度更快”这一点,有点难以測试。
对此我写了一个高速測试来看看我能以多快的速度来把一个XML和JSON字符串转化为Java对象。
对于XML解析,我使用Java内置的 SAX解析器。SAX解析器同意遍历XML文件,并把XML值赋给对象中适当的字段。这样的方法相对JSON解析是比較繁琐的,但不是没有道理。
JSON的解析,我使用了GSON库,仅仅需用一行代码就能够非常easy地在JSON和java对象之间转换,仅仅须要一个这个类的定义就能够了(如Book类, 字段名和JSON中的相应)。只是这使得这个类变量和JSON实例绑定到了一起。一旦类的实例名称或JSON字段名有了变化,将会出现故障。
三、实例比較
XML和JSON都使用结构化方法来标记数据。下面来做一个简单的比較。
<1>.用XML表示中国部分省市数据例如以下:
<?xmlversion="1.0" encoding="utf-8" ?> <country> <name>中国</name> <province> <name>黑龙江</name> <citys> <city>哈尔滨</city> <city>大庆</city> </citys> </province> <province> <name>广东</name> <citys> <city>广州</city> <city>深圳</city> <city>珠海</city> </citys> </province> </country>
<2>.用JSON表示中国部分省市数据例如以下:
var country = { name: "中国", provinces: [ { name: "黑龙江", citys: { city: ["哈尔滨","大庆"]} }, { name: "广东", citys: { city: ["广州","深圳", "珠海"]}}, { name: "台湾", citys: { city: ["台北","高雄"]} }, { name: "新疆", citys: { city: ["乌鲁木齐"]}} ] }
底层实现:
json解析的用法:底层原理遍历字符串中的字符,终于依据格式规定的特殊字符,比方{}号,[]号, : 号 等进行区分,
{}号是一个字典的開始,[]号是一个数组的開始,: 号是字典的键和值的分水岭,终于乃是将json数据转化为字典。
字典中值可能是字典,数组。或字符串而已。
40、什么是动态识别,动态绑定?【难度系数★★★★】
一、Objective-C多态
1.概念:同样接口。不同的实现
来自不同类能够定义共享同样名称的方法。
动态类型能使程序直到执行时才确定对象所属类型
动态类型绑定能使程序直到执行时才确定要对对象调用的实际方法
2.Objective-C不同于传统程序设计语言,它能够再执行时加入新的数据类型和新的程序模块:动态类型识别,动态绑定,动态载入
3.id类型:通用指针类型,弱类型,编译时不进行类型检查
二、动态类型识别
1.随意NSObject的子类都会继承NSObject的isa实例变量,而且当NSObject的子类实例化对象时,isa实例变量永远是对象的第一个实例变量。
2.类对象
*类对象再程序执行时一直存在。
*类对象是一种数据结构,存储类的基本信息:类大小。类名称,类的版本号以及消息与函数的映射表等
*类对象所保存的信息在程序编译时确定。在程序启动时载入到内存中。
*类对象代表类,class代表类对象,类方法属于类对象
*假设消息的接收者是类名,则类名代表类对象
*执行时,全部类的实例都由类对象生成。类对象会把实例的isa的值修改成自己的地址,每一个实例的isa都指向该实例的类对象。*从类对象里能够知道父类信息、能够响应的方法等
*类对象仅仅能使用类方法,不能用实例方法
3.SEL类型
Objective-C在编译的时候,会依据方法的名字 (包含參数序列),生成一个用来区分这种方法的唯一的一个标示(ID),这个标示(ID)就是SEL类型的,在执行时候是通过方法的标示来查找方法的。仅仅 要方法的名字(包含參数序列)同样,那么它们的 ID都是同样的。能够通过@select()指示符获得方法的标示。SEL mydraw=@select(draw)。
NSSelectorFromString(NSString*);依据方法名得到方法标识
(NSString*)NSStringFromSelector(SEL);得到SEL类型的方法名
4.动态类型识别经常用法
-(BOOL)isKindOfClass:classObj 是否是classObj类或其子类
-(BOOL)isMemberOfClass:classObj是否是classObj的实例
-(BOOL)respondsTosSelector:selector 类中是否有这种方法
NSClassFromString(NSString*);由字符串得到类对象
NSStringFromClass([类名 Class]);由类名得到字符串
Class rectClass= [Rectangle class];通过类名得到类对象
Class aClass =[anObject class];通过实例得到类对象
if([obj1 class]== [obj2 class])推断是不是同样类的实例
5. 能够将对象分为id类型和静态类型
– 假设不涉及到多态,尽量使用静态类型
– 静态类型可更好的在编译阶段而不是执行阶段指出错误
– 静态类型能够提高程序的可读性
三、动态绑定
1. 在objective-c中,一个对象内否调用指定的方法不是由编译器决定而是由执行时决定,这被称作是方法的动态绑定。
2. 在objective-c里,对象不调用方法,而是接收消息,消息 表达式为: [reciver message];执行时系统首先确定接收者的类型(动态类型识别),然 后依据消息名在类的方法列表里选择相依的方法执行,所 以在源码里消息也称为选择器(selector)
3. 消息函数的作用:
– 首先通过第一个參数的receiver,找到它的isa 指针,然后在isa 指向的Class 对象中使用第二个參数selector 查 找方法;
– 假设没有找到,就使用当前Class 对象中的新的isa指针 到上一级的父类的Class 对象中查找;
– 当找到方法后,再依据receiver 的中的self指针找到当前 的对象,调用当前对象的详细实现的方法(IMP),然后传递參数,调用实现方法。
– 假如一直找到NSObject 的Class 对象,也没有找到你调用的方法,就会报告不能识别发送消息的错误。
41、线程与进程的差别和联系?【难度系数★★】
1). 进程和线程都是由操作系统所体会的程序执行的基本单元,系统利用该基本单元实现系统相应用的并发性
2). 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。
3). 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程仅仅是一个进程中的不同执行路径。
4.)线程有自己的堆栈和局部变量。但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。
所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
5). 但对于一些要求同一时候进行而且又要共享某些变量的并发操作,仅仅能用线程,不能用进程。
42、iOS中socket使用【难度系数★★★★★】
Socket是对TCP/IP协议的封装,Socket本身并非协议,而是一个调用接口(API),通过Socket,我们才干使用TCP/IP协议。
http协议:相应于应用层
tcp协议:相应于传输层
ip协议:相应于网络层
三者本质上没有可比性。何况HTTP协议是基于TCP连接的。
TCP/IP是传输层协议,主要解决数据怎样在网络中传输。而HTTP是应用层协议,主要解决怎样包装数据。
我们在数据传输时。能够仅仅使用传输层(TCP/IP),可是那样的话。由于没有应用层,便无法识别数据内容,假设想要使传输的数据有意义。则必须使用应用层 协议,应用层协议非常多,有HTTP、FTP、TELNET等等。也能够自己定义应用层协议。
WEB使用HTTP作传输层协议。以封装HTTP文本信息,然后使用TCP/IP做传输层协议将它发送到网络上。
SOCKET原理
1、套接字(socket)概念
套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示。包含进行网络通信必须的五种信息:连接使用的协议。本地主机的IP地址。本地进程的协议port,远地主机的IP地址。远地进程的协议port。
应用层通过传输层进行数据通信时,TCP会遇到同一时候为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能须要通过同一个 TCP协议port数据传输。为了差别不同的应用程序进程和连接,很多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层能够和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信。实现数据传输的并发服务。
2、建立socket连接
建立Socket连接至少须要一对套接字,当中一个执行于client,称为ClientSocket,还有一个执行于server端,称为ServerSocket。
套接字之间的连接过程分为三个步骤:server监听。client请求。连接确认。
server监听:server端套接字并不定位详细的client套接字。而是处于等待连接的状态,实时监控网络状态,等待client的连接请求。
client请求:指client的套接字提出连接请求。要连接的目标是server端的套接字。为此。client的套接字必须首先描写叙述它要连接的server的套接字,指出server端套接字的地址和port号,然后就向server端套接字提出连接请求。
连接确认:当server端套接字监听到或者说接收到client套接字的连接请求时。就响应client套接字的请求,建立一个新的线程,把server端套接字的描写叙述发给client。一旦client确认了此描写叙述,两方就正式建立连接。
而server端套接字继续处于监听状态,继续接收其它client套接字的连接请求。
3、SOCKET连接与TCP连接
创建Socket连接时。能够指定使用的传输层协议,Socket能够支持不同的传输层协议(TCP或UDP)。当使用TCP协议进行连接时,该Socket连接就是一个TCP连接。
4、Socket连接与HTTP连接
由于通常情况下Socket连接就是TCP连接。因此Socket连接一旦建立,通信两方就可以開始相互发送数据内容,直到两方连接断开。
但在实际网络应用中,client到server之间的通信往往须要穿越多个中间节点,比如路由器、网关、防火墙等。大部分防火墙默认会关闭长时间处于非活跃状态的连接而导致 Socket 连接断连。因此须要通过轮询告诉网络,该连接处于活跃状态。
而HTTP连接使用的是“请求—响应”的方式,不仅在请求时须要先建立连接,而且须要client向server发出请求后,server端才干回复数据。
非常多情况下,须要server端主动向client推送数据,保持client与server数据的实时与同步。
此时若两方建立的是Socket连接,server就能够直接将数据传送给 client。若两方建立的是HTTP连接,则server须要等到client发送一次请求后才干将数据传回给client。因此。client定时向server端发送连接请求。不仅能够保持在线,同一时候也是在“询问”server是否有新的数据,假设有就将数据传给client。
43、远程推送【难度系数★★★★★】
当服务端远程向APNS推送至一台离线的设备时,苹果serverQos组件会自己主动保留一份最新的通知,等设备上线后,Qos将把推送发送到目标设备上。
远程推送的基本过程:
1.client的app须要将用户的UDID和app的bundleID发送给apnsserver,进行注冊,apns将加密后的device Token返回给app
2.app获得device Token后,上传到公司server
3.当须要推送通知时,公司server会将推送内容和device Token一起发给apnsserver
4.apns再将推送内容送到client上
创建证书的流程:
1.打开钥匙串。生成CertificateSigningRequest.certSigningRequest文件
2.将CertificateSigningRequest.certSigningRequest上传进developer。导出.cer文件
3.利用CSR导出P12文件
4.须要准备下设备token值(无空格)
5.使用OpenSSL合成server所使用的推送证书
本地app代码參考
1.注冊远程通知
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions//中注冊远程通知
{
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];
}
2,实现几个代理方法:
//获取deviceToken令牌
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
//获取设备的deviceToken唯一编号
NSLog(@"deviceToken=%@",deviceToken);
NSString *realDeviceToken=[NSString stringWithFormat:@"%@",deviceToken];
//去除<>
realDeviceToken = [realDeviceToken stringByReplacingOccurrencesOfString:@"<" withString:@""];
realDeviceToken = [realDeviceToken stringByReplacingOccurrencesOfString:@">" withString:@""];
NSLog(@"realDeviceToken=%@",realDeviceToken);
[[NSUserDefaults standardUserDefaults] setValue:realDeviceToken forKey:@"DeviceToken"]; //要发送给server
}
//获取令牌出错
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
//注冊远程通知设备出错
NSLog(@"RegisterForRemoteNotification error=%@",error);
}
//在应用在前台时受到消息调用
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
//打印推送的消息
NSLog(@"%@",[[userInfo objectForKey:@"aps"] objectForKey:@"alert"]):
}
配置后台模式
一般我们是使用开发版本号的Provisioning做推送測试,假设没有问题,再使用公布版本号证书的时候一般也应该是没有问题的。为了以防万一,我们能够在越狱的手机上安装我们的使用公布版证书的ipa文件(最好使用debug版本号,并打印出获取到的deviceToken),成功安装后在;XCode->Window->Organizer-找到相应的设备查看console找到打印的deviceToken。
在后台的推送程序中使用公布版制作的证书并使用该deviceToken做推送服务.
使用开发和公布证书获取到的deviceToken是不一样的。
44、什么是事件响应链,其特点是什么。【难度系数★★★★★】
对于iOS设备用户来说。他们操作设备的方式主要有三种:触摸屏幕、晃动设备、通过遥控设施控制设备。相应的事件类型有下面三种:
1、触屏事件(Touch Event)
2、运动事件(Motion Event)
3、远端控制事件(Remote-Control Event)
响应者链(Responder Chain)
响应者对象(Responder Object)。指的是有响应和处理事件能力的对象。响应者链就是由一系列的响应者对象构成的一个层次结构。
UIResponder是全部响应对象的基类。在UIResponder类中定义了处理上述各种事件的接口。我们熟悉的UIApplication、 UIViewController、UIWindow和全部继承自UIView的UIKit类都直接或间接的继承自UIResponder。所以它们的实例都是能够构成响应者链的响应者对象。
响应者链有下面特点:
1、响应者链一般是由视图(UIView)构成的;
2、一个视图的下一个响应者是它视图控制器(UIViewController)(假设有的话),然后再转给它的父视图(SuperView)。
3、视图控制器(假设有的话)的下一个响应者为其管理的视图的父视图。
4、单例的窗体(UIWindow)的内容视图将指向窗体本身作为它的下一个响应者
须要指出的是,Cocoa Touch应用不像Cocoa应用。它仅仅有一个UIWindow对象,因此整个响应者链要简单一点;
5、单例的应用(UIApplication)是一个响应者链的终点,它的下一个响应者指向nil,以结束整个循环。
45、软件开发的步骤、分工、工作配合。