iOS面试题及答案

1.写一个NSString类的实现java

+ (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;ios

+ (id) stringWithCString: (c*****t char*)nullTerminatedCStringc++

encoding: (NSStringEncoding)encoding程序员

{web

NSString *obj;objective-c

obj = [self allocWithZone: NSDefaultMallocZone()];数据库

obj = [obj initWithCString: nullTerminatedCString encoding: encoding];编程

return AUTORELEASE(obj);json

}设计模式

2static 关键字的做用:

(1)函数体内 static 变量的做用范围为该函数体,不一样于 auto 变量,该变量的内存只被分配一次,所以其值在下次调用时仍维持上次的值;

(2)在模块内的 static 全局变量能够被模块内所用函数访问,但不能被模块外其它函数访问;

(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;

(4)在类中的 static 成员变量属于整个类所拥有,对类的全部对象只有一份拷贝;

(5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,于是只能访问类的static 成员变量。

3线程与进程的区别和联系?

进程和线程都是由操做系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的主要差异在于它们是不一样的操做系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进 程中的不一样执行路径。线程有本身的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程序健 壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行而且又要共享某些变量的并发操做,只能用线程,不能用进程。

<进程和线程关系及区别>

<1>定义:进程是具备必定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程本身基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),可是它可与同属一个进程的其余的线程共享进程所拥有的所有资源.

<2>关系:一个线程能够建立和撤销另外一个线程;同一个进程中的多个线程之间能够并发执行.相对进程而言,线程是一个更加接近于执行体的概念,它能够与同进程中的其余线程共享数据,但拥有本身的栈空间,拥有独立的执行序列。 

<3>区别:进程和线程的主要差异在于它们是不一样的操做系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不一样执行路径。线程有本身的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,因此多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行而且又要共享某些变量的并发操做,只能用线程,不能用进程。

1) 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

2) 线程的划分尺度小于进程,使得多线程程序的并发性高。

3) 另外,进程在执行过程当中拥有独立的内存单元,而多个线程共享内存,从而极大地提升了程序的运行效率。

4) 线程在执行过程当中与进程仍是有区别的。每一个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。可是线程不可以独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

5) 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分能够同时执行。但操做系统并无将多个线程看作多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

<4>优缺点:线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则能够跨机器迁移。

4堆和栈的区别

管理方式:对于栈来说,是由编译器自动管理,无需咱们手工控制;对于堆来讲,释放工做由程序员控制,容易产生memory leak。

申请大小:

栈: 在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就肯定的常数),若是申请的空间超过栈的剩余空间时,将提示overflow。因 此,能从栈得到的空间较小。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是因为系统是用链表来存储的空闲内存地址的,天然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。因而可知,堆得到的空间比较灵活,也比较大。

碎片问题:对于堆来说,频繁的new/delete势必会形成内存空间的不连续,从而形成大量的碎片,使程序效率下降。对于栈来说,则不会存在这个问题,由于栈是先进后出的队列,他们是如此的一一对应,以致于永远都不可能有一个内存块从栈中间弹出

分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,好比局部变量的分配。动态分配由alloca函数进行分配,可是栈的动态分配和堆是不一样的,他的动态分配是由编译器进行释放,无需咱们手工实现。

分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。

5什么是键-,键路径是什么

模型的性质是经过一个简单的键(一般是个字符串)来指定的。视图和控制器经过键来查找相应的属性值。在一个给定的实体中,同一个属性的全部值具备相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。键路径是一个由用点做分隔符的键组成的字符串,用于指定一个链接在一块儿的对象性质序列。第一个键的性质是由先前的性质决定的,接下来每一个键的值也是相对于其前面的性质。键路径使您能够以独立于模型实现的方式指定相关对象的性质。经过键路径,您能够指定对象图中的一个任意深度的路径,使其指向相关对象的特定属性。

6目标-动做机制

目标是动做消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量的形式保有其动做消息的目标。动做是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动做而实现的方法。程序须要某些机制来进行事件和指令的翻译。这个机制就是目标-动做机制。

7objc的内存管理

若是您经过分配和初始化(好比[[MyClass alloc] init])的方式来建立对象,您就拥有这个对象,须要负责该对象的释放。这个规则在使用NSObject的便利方法new 时也一样适用。若是您拷贝一个对象,您也拥有拷贝获得的对象,须要负责该对象的释放。 若是您保持一个对象,您就部分拥有这个对象,须要在再也不使用时释放该对象。反过来, 若是您从其它对象那里接收到一个对象,则您不拥有该对象,也不该该释放它。谁建立,谁释放;谁持有,谁释放。

8 自动释放池是什么,如何工做

当 您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,所以自动释放池定义的做用域内的其它对象能够向它发送消息。当程序执行到做用域结束的位置时,自动释放池就会被释放,池中的全部对象也就被释放。

1. oc 是 经过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,之后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,若是此对象的计数变为了0, 就会被系统销毁.

2. NSAutoreleasePool 就是用来作引用计数的管理工做的,这个东西通常不用你管的.

3. autorelease和release没什么区别,只是引用计数减一的时机不一样而已,autorelease会在对象的使用真正结束的时候才作引用计数减一.

9类工厂方法是什么

类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被建立的对象,并进行自动释放处理。这些方法的形式是+ (type)className...(其中 className不包括任何前缀)。工厂方法可能不只仅为了方便使用。它们不但能够将分配和初始化合在一块儿,还能够为初始化过程提供对象的分配信息。类工厂方法的另外一个目的是使类(好比NSWorkspace)提供单件实例。虽然init...方法能够确认一个类在每次程序运行过程只存在一个实例,但它须要首先分配一个“生的”实例,而后还必须释放该实例。工厂方法则能够避免为可能没有用的对象盲目分配内存。

10单件实例是什么

Foundation 和 Application Kit 框架中的一些类只容许建立单件对象,即这些类在当前进程中的惟一实例。举例来讲,NSFileManager 和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,若是该实例还不存在,则首先进行实例的分配 和初始化。单件对象充当控制中心的角色,负责指引或协调类的各类服务。若是类在概念上只有一个实例(好比NSWorkspace),就应该产生一个单件实例,而不是多个实例;若是未来某一天可能有多个实例,您能够使用单件实例机制,而不是工厂方法或函数。

11动态绑定—在运行时肯定要调用的方法

 动态绑定将调用方法的肯定也推迟到运行时。在编译时,方法的调用并不和代码绑定在一块儿,只有在消息发送出来以后,才肯定被调用的代码。经过动态类型和动态绑 定技术,您的代码每次执行均可以获得不一样的结果。运行时因子负责肯定消息的接收者和被调用的方法。运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型肯定了的对象发送消息时,运行环境系统会经过接收者的isa指针定位对象的类,并以此为起点肯定被调用的方法,方法和消息是动态绑定的。并且,您没必要在Objective-C 代码中作任何工做,就能够自动获取动态绑定的好处。您在每次发送消息时,特别是当消息的接收者是动态类型已经肯定的对象时,动态绑定就会例行而透明地发生。

12obj-c的优缺点

objc优势:

1) Cateogies

2) Posing

3) 动态识别

4) 指标计算

5)弹性讯息传递

6) 不是一个过分复杂的 C 衍生语言

7) Objective-C 与 C++ 可混合编程

缺点:

1) 不支援命名空间

2) 不支持运算符重载

3)不支持多重继承

4)使用动态运行时类型,全部的方法都是函数调用,因此不少编译时优化方法都用不到。(如内联函数等),性能低劣。

13sprintf,strcpy,memcpy使用上有什么要注意的地方

strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, c*****t char *src);将 src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',因为拷贝的长度不是由咱们本身控制的,因此这个字符串拷贝很容易出错。具有字符串拷贝功能的函数有memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(char *dst, c*****t char* src, unsigned int len);将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。可是会有内存叠加的问题。sprintf是格式化函数。将一段数据经过特定的格式,格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,形成溢出。

14解释如下C语句的含义:

a) int a; // An integer

b) int *a; // A pointer to an integer

c) int **a; // A pointer to a pointer to an integer

d) int a[10]; // An array of 10 integers

e) int *a[10]; // An array of 10 pointers to integers

f) int (*a)[10]; // A pointer to an array of 10 integers

g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer

h) int (*a[10])(int); // An array of 10 pointers to functi***** that take an integer argument and return an integer

15.readwritereadonlyassignretaincopynonatomic属性的做用

@property是一个属性访问声明,扩号内支持如下几个属性:

1,getter=getterName,setter=setterName,设置setter与getter的方法名

2,readwrite,readonly,设置可供访问级别

2,assign,setter方法直接赋值,不进行任何retain操做,为了解决原类型与环循引用问题

3,retain,setter方法对参数进行release旧值再retain新值,全部实现都是这个顺序

4,copy,setter方法进行Copy操做,与retain处理流程同样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减小对上下文的依赖而引入的机制。copy是在你不但愿a和b共享一块内存时会使用到。a和b各自有本身的内存。

5,nonatomic,非原子性访问,不加同步,多线程并发访问会提升性能。注意,若是不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操做。在多线程环境下,原子操做是必要的,不然有可能引发错误的结果。

16何时用delegate,何时用Notification?

delegate针对one-to-one关系,而且reciever能够返回值 给sender,notification 能够针对one-to-one/many/none,reciever没法返回值给sender.因此,delegate用于sender但愿接受到 reciever的某个功能反馈值,notification用于通知多个object某个事件。

17什么是KVC和KVO?

KVC(Key-Value-Coding)内部的实现:一个对象在调用setValue的时候,(1)首先根据方法名找到运行方法的时候所须要的环 境参数。(2)他会从本身isa指针结合环境参数,找到具体的方法实现的接口。(3)再直接查找得来的具体的方法实现。

KVO(Key-Value- Observing):当观察者为一个对象的属性进行了注册,被观察对象的isa指针被修改的时候,isa指针就会指向一个中间类,而不是真实的类。因此 isa指针其实不须要指向实例对象真实的类。因此咱们的程序最好不要依赖于isa指针。在调用类的方法的时候,最好要明确对象实例的类名。

18ViewController 的 loadView, viewDidLoad, viewDidUnload 分别是在何时调用的?在自定义ViewController的时候这几个函数里面应该作什么工做?

viewDidLoad在view 从nib文件初始化时调用;loadView在controller的view为nil时调用。此方法在编程实现view时调用;view 控制器默认会注册memory warning notification,当view controller的任何view 没有用的时候,viewDidUnload会被调用,在这里实现将retain 的view release,若是是retain的IBOutlet view 属性则不要在这里release,IBOutlet会负责release 。

19简述面向过程和面向对象

面向过程就是分析出解决问题所须要的步骤,而后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就能够了。

面向对象是把构成问题事务分解成各个对象,创建对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。

20类别的做用

类别主要有3个做用:

(1)将类的实现分散到多个不一样文件或多个不一样框架中。

(2)建立对私有方法的前向引用。

(3)向对象添加非正式协议。

类别的局限性

有两方面局限性:

(1)没法向类中添加新的实例变量,类别没有位置容纳实例变量。

(2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具备更高的优先级。类别方法将彻底取代初始方法从而没法再使用初始方法。

21@synthesize 是系统自动生成getter和setter属性声明

@dynamic 是开发者自已提供相应的属性声明,@dynamic 意思是由开发人员提供相应的代码:对于只读属性须要提供 setter,对于读写属性须要提供 setter 和 getter。@synthesize 意思是,除非开发人员已经作了,不然由编译器生成相应的代码,以知足属性声明。查阅了一些资料肯定@dynamic的意思是告诉编译器,属性的获取与赋值方法由用户本身实现, 不自动生成。

22Difference between shallow copy and deep copy?(浅复制和深复制的区别?)

浅层复制:只复制指向对象的指针,而不复制引用对象自己。
深层复制:复制引用对象自己。
意思就是说我有个A对象,复制一份后获得A_copy对象后,对于浅复制来讲,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象自己资源
仍是只有一份,那若是咱们对A_copy执行了修改操做,那么发现A引用的对象一样被修改,这其实违背了咱们复制拷贝的一个思想。深复制就好理解了,内存中存在了
两份独立对象自己。
浅复制比如你和你的影子,你完蛋,你的影子也完蛋
深复制比如你和你的克隆人,你完蛋,你的克隆人还活着。

23What is advantage of categories? What is difference between implementing a category and inheritance?

类别的做用?继承和类别在实现中有何区别?
category 能够在不获悉,不改变原来代码的状况下往里面添加新的方法,只能添加,不能删除修改。
而且若是类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,由于类别具备更高的优先级。
类别主要有3个做用:
(1)将类的实现分散到多个不一样文件或多个不一样框架中。
(2)建立对私有方法的前向引用。
(3)向对象添加非正式协议。
继承能够增长,修改或者删除方法,而且能够增长属性。

24.Difference between categories and extensions?
类别和类扩展的区别。
category和extensions的不一样在于 后者能够添加属性。另外后者添加的方法是必需要实现的。
extensions能够认为是一个私有的Category。

25.Difference between protocol in objective c and interfaces in java?oc中的协议和java中的接口概念有何不一样?

OC中的代理有2层含义,官方定义为 formal和informal protocol。前者和Java接口同样。
informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,可是若是有实现,就会改变类的属性。
其实关于正式协议,类别和非正式协议我很早前学习的时候大体看过,也写在了学习教程里
“非正式协议概念其实就是类别的另外一种表达方式“这里有一些你可能但愿实现的方法,你能够使用他们更好的完成工做”。
这个意思是,这些是可选的。好比我门要一个更好的方法,咱们就会申明一个这样的类别去实现。而后你在后期能够直接使用这些更好的方法。
这么看,总以为类别这玩意儿有点像协议的可选协议。"
如今来看,其实protocal已经开始对二者都统一和规范起来操做,由于资料中说“非正式协议使用interface修饰“,
如今咱们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。

26What is purpose of delegates?
代理的做用?
代理的目的是改变或传递控制链。容许一个类在某些特定时刻通知到其余类,而不须要获取到那些类的指针。能够减小框架复杂度。
另一点,代理能够理解为java中的回调监听机制的一种相似。

27What are mutable and immutable types in Objective C?

可修改不可修改的集合类。这个我我的简单理解就是可动态添加修改和不可动态添加修改同样。好比NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者能够添加等,能够动态申请新的内存空间。

28When we call objective c is runtime language what does it mean?咱们说的oc是动态运行时语言是什么意思?

多态。 主要是将数据类型的肯定由编译时,推迟到了运行时。这个问题其实浅涉及到两个概念,运行时和多态。简单来讲,运行时机制使咱们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。多态:不一样对象以本身的方式响应相同的消息的能力叫作多态。意思就是假设生物类(life)都用有一个相同的方法-eat;那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,可是调用是咱们只需调用各自的eat方法。也就是不一样的对象以本身的方式响应了相同的消息(响应了eat这个选择器)。所以也能够说,运行时机制是多态的基础。

29What is push notification?什么是推送消息?

推送通知是一种技术。简单点就是客户端获取资源的一种手段。普通状况下,都是客户端主动的pull。推送则是服务器端主动push。

目前的Push技术实现基本都是Client主动链接Server,钻牛角尖来说,如今的Push其实都是伪Push。下面简单讲两种方式:
1、轮询法:
这种方法最简单,Client每过一段时间向Server请求一次数据。优缺点很明显,优势是实现简单;缺点是间隔时间很差控制,而且消耗大(电量、流量)。
2、长链接法:
仍是从socket入手(又是这货?),Client使用socket链接Server,而且保持socket链接,Server随时能够经过这个socket发送数据给Client。优势:最有效,客户端设备消耗比第一种小(设备应该从系统层对socket的长链接作优化,socket连接维护成本从客户端来说应该是小于频繁的http请求的);缺点:服务端压力大,每个设备都须要一个socket链接。
还有一些其余协议好比xmpp,其实也逃不过上面两种方式,只是作了一些封装。或者还有一种非互联网方式的作法,好比监听短信法,要push的时候,先发一条手机到目的手机,Client监听到了标的短信,而后向Server请求数据,不过像这类剑走偏锋的方法,限制条件也不少,不是很实用。
总结一下,目前各个推送平台的实现都是基于长链接法的,若是App要本身实现推送,也是建议使用这种方式。可是若是每一个App都用一个长链接,那么手机也吃不消了,因此又有一些其余技术来实现,

30.Polymorphism?
关于多态性
多态,子类指针能够赋值给父类。

31What is responder chain?

事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。能够说点事件的分发,传递以及处理。具体能够去看下touch事件这块。

32Difference between frame and bounds?
frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
bounds指的是:该view在自己坐标系统中 的位置和大小。(参照点是自己坐标系统)

33.Difference between method and selector?
selector是一个方法的名字,method是一个组合体,包含了名字和实现.

34What is lazy loading?

懒汉模式,只在用到的时候才去初始化。也能够理解成延时加载。最好也最简单的一个列子就是tableView中图片的加载显示了。一个延时载,避免内存太高,一个异步加载,避免线程堵塞。

35Can we use two tableview controllers on one viewcontroller?

是否在一个视图控制器中嵌入两个tableview控制器?一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,只能说能够嵌入一个tableview视图。固然,题目自己也有歧义,若是不是咱们定性思惟认为的UIViewController,而是宏观的表示视图控制者,那咱们却是能够把其当作一个视图控制者,它能够控制多个视图控制器,好比TabbarController那样的感受。

36Can we use one tableview with two different datasources? How you will achieve this?

一个tableView是否能够关联两个不一样的数据源?你会怎么处理?首先咱们从代码来看,数据源如何关联上的,实际上是在数据源关联的代理方法里实现的。所以咱们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据本身的须要去设置如相关的数据源。所以,我以为能够设置多个数据源啊,可是有个问题是,你这是想干吗呢?想让列表如何显示,不一样的数据源分区块显示?

37id、nil表明什么?

id和void *并不是彻底同样。在上面的代码中,id是指向struct objc_object的一个指针,这个意思基本上是说,id是一个指向任何一个继承了Object(或者NSObject)类的对象。须要注意的是id是一个指针,因此你在使用id的时候不须要加星号。好比id foo=nil定义了一个nil指针,这个指针指向NSObject的一个任意子类。而id *foo=nil则定义了一个指针,这个指针指向另外一个指针,被指向的这个指针指向NSObject的一个子类。

nil和C语言的NULL相同,在objc/objc.h中定义。nil表示一个Objctive-C对象,这个对象的指针指向空(没有东西就是空)。

首字母大写的Nil和nil有一点不同,Nil定义一个指向空的类(是Class,而不是对象)。

SEL是“selector”的一个类型,表示一个方法的名字

Method(咱们常说的方法)表示一种类型,这种类型与selector和实现(implementation)相关

38层和UIView的区别是什么?

二者最大的区别是,图层不会直接渲染到屏幕上,UIView是iOS系统中界面元素的基础,全部的界面元素都是继承自它。它自己彻底是由CoreAnimation来实现的。它真正的绘图部分,是由一个CALayer类来管理。UIView自己更像是一个CALayer的管理器。一个UIView上能够有n个CALayer,每一个layer显示一种东西,加强UIView的展示能力。

39GCD为Grand Central Dispatch的缩写。 

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD彻底能够处理诸如数据锁定和资源泄漏等复杂的异步编程问题。GCD能够完成不少事情,可是这里仅关注在iOS应用中实现多线程所需的一些基础知识。在开始以前,须要理解是要提供给GCD队列的是代码块,用于在系统或者用户建立的的队列上调度运行。  

声明一个队列   

以下会返回一个用户建立的队列:

  dispatch_queue_t myQueue = dispatch_queue_create("com.iphonedevblog.post", NULL);其中,第一个参数是标识队列的,第二个参数是用来定义队列的参数(目前不支持,所以传入NULL)。 

执行一个队列  

 以下会异步执行传入的代码: 

 dispatch_async(myQueue, ^{ [self doSomething]; });其中,首先传入以前建立的队列,而后提供由队列运行的代码块。  

声明并执行一个队列   

  若是不须要保留要运行的队列的引用,能够经过以下代码实现以前的功能:  

  dispatch_async(dispatch_queue_create ("com.iphonedevblog.post", NULL), ^{ [self doSomething]; });  若是须要暂停一个队列,能够调用以下代码。暂停一个队列会阻止和该队列相关的全部代码运行。  dispatch_suspend(myQueue);

暂停一个队列  

若是暂停一个队列不要忘记恢复。暂停和恢复的操做和内存管理中的retain和release相似。调用dispatch_suspend会增长暂停计数,而dispatch_resume则会减小。队列只有在暂停计数变成零的状况下才开始运行。dispatch_resume(myQueue);恢复一个队列   

从队列中在主线程运行代码  

有些操做没法在异步队列运行,所以必须在主线程(每一个应用都有一个)上运行。UI绘图以及任何对NSNotificationCenter的调用必须在主线程长进行。在另外一个队列中访问主线程并运行代码的示例以下:  dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });注意,dispatch_suspend (以及dispatch_resume)在主线程上不起做用。

使用GCD,可让你的程序不会失去响应. 多线程不容易使用,用了GCD,会让它变得简单。你无需专门进行线程管理, 很棒!

dispatch_queue_t t1=dispatch_queue_create("1", NULL);

dispatch_queue_t t2=dispatch_queue_create("2", NULL);

dispatch_async(t1, ^{

[self print1];

});

dispatch_async(t2, ^{

[self print2];

});

40Provider是指某个iPhone软件的Push服务器。 

APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。

大体能够分为三个阶段。

第一阶段:.net应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。 
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。 
第三阶段:iPhone把发来的消息传递给相应的应用程序, 而且按照设定弹出Push通知。

41XML与HTML

<1>可扩展标记语言extensible markup language;XML

<2>用于标记电子文件使其具备结构性的标记语言,能够用来标记数据、定义数据类型,是一种容许用户对本身的标记语言进行定义的源语言。

<3>数据库提供了更强有力的数据存储和分析能力,例如:数据索引、排序、查找、相关一致性等,XML仅仅是存储数据。

<4>XML与HTML的设计区别是:XML的核心是数据,其重点是数据的内容。而HTML 被设计用来显示数据,其重点是数据的显示。

<5>XML和HTML语法区别:HTML的标记不是全部的都须要成对出现,XML则要求全部的标记必须成对出现;HTML标记不区分大小写,XML则 大小敏感,即区分大小写。

结合

  XML的简单使其易于在任何应用程序中读写数据,这使XML很快成为数据交换的惟一公共语言,虽然不一样的应用软件也支持其它的数据交换格式,但不久以后他们都将支持XML,那就意味着程序能够更容易的与Windows,Mac OS,Linux以及其余平台下产生的信息结合,而后能够很容易加载XML数据到程序中并分析他,并以XML格式输出结果。

  XML去掉了以前令许多开发人员头疼的SGML(标准通用标记语言)的随意语法。在XML中,采用了以下的语法:

  1 任何的起始标签都必须有一个结束标签。

  2 能够采用另外一种简化语法,能够在一个标签中同时表示起始和结束标签。这种语法是在大于符号以前紧跟一个斜线(/),例如。XML解析器会将其翻译成。

  3 标签必须按合适的顺序进行嵌套,因此结束标签必须按镜像顺序匹配起始标签,例如this is a samplestring。这比如是将起始和结束标签看做是数学中的左右括号:在没有关闭全部的内部括号以前,是不能关闭外面的括号的。

  4 全部的特性都必须有值。

  5 全部的特性都必须在值的周围加上双引号。

42ASIDownloadCache 设置下载缓存

它对Get请求的响应数据进行缓存(被缓存的数据必需是成功的200请求):

[ASIHTTPRequest setDefaultCache:[ASIDownloadCache sharedCache]];

当设置缓存策略后,全部的请求都被自动的缓存起来。

另外,若是仅仅但愿某次请求使用缓存操做,也能够这样使用:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];

[request setDownloadCache:[ASIDownloadCache sharedCache]];

缓存存储方式

你能够设置缓存的数据须要保存多长时间,ASIHTTPRequest提供了两种策略:

a,ASICacheForSessionDurationCacheStoragePolicy,默认策略,基于session的缓存数据存储。当下次运行或[ASIHTTPRequest clearSession]时,缓存将失效。

b,ASICachePermanentlyCacheStoragePolicy,把缓存数据永久保存在本地,

如:

ASIHTTPRequest *request = [ ASIHTTPRequest requestWithURL:url ];

[ request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy ];

 

43HTTP协议详解

HTTP是一个属于应用层的面向对象的协议,因为其简捷、快速的方式,适用于分布式超媒体信息系统。http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的链接方式,HTTP1.1版本中给出一种持续链接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。

HTTP协议的主要特色可归纳以下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法经常使用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不一样。因为HTTP协议简单,使得HTTP服务器的程序规模小,于是通讯速度很快。
3.灵活:HTTP容许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无链接:无链接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开链接。采用这种方式能够节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,这样可能致使每次链接传送的数据量增大。另外一方面,在服务器不须要先前信息时它的应答就较快。

44URL

HTTP URL (URL是一种特殊类型的URI是他的子类,包含了用于查找某个资源的足够的信息)的格式以下:
http://host[":"port][abs_path]
http表示要经过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口80;abs_path指定请求资源的URI;若是URL中没有给出abs_path,那么当它做为请求URI时,必须以“/”的形式给出,一般这个工做浏览器自动帮咱们完成。

45TCP/UDP区别联系

TCP---传输控制协议,提供的是面向链接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间创建一个TCP链接,以后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另外一端。

UDP---用户数据报协议,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,可是并不能保证它们能到达目的地。因为UDP在传输数据报前不用在客户和服务器之间创建一个链接,且没有超时重发等机制,故而传输速度很快

TCP(Transmission Control Protocol,传输控制协议)是基于链接的协议,也就是说,在正式收发数据前,必须和对方创建可靠的链接。一个TCP链接必需要通过三次“对话”才能创建起来,咱们来看看这三次对话的简单过程:1.主机A向主机B发出链接请求数据包;2.主机B向主机A发送赞成链接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工做)的数据包;3.主机A再发出一个数据包确认主机B的要求同步:“我如今就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,通过三次“对话”以后,主机A才向主机B正式发送数据。

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非链接的协议,它不与对方创建链接,而是直接就把数据包发送过去! UDP适用于一次只传送少许数据、对可靠性要求不高的应用环境。

      tcp协议和udp协议的差异

是否链接     面向链接 面向非链接

传输可靠性   可靠 不可靠

应用场合 传输大量数据 少许数据

速度            慢         快

46socket链接和http链接的区别

简单说,你浏览的网页(网址以http://开头)都是http协议传输到你的浏览器的, 而http是基于socket之上的。socket是一套完成tcp,udp协议的接口。

HTTP协议:简单对象访问协议,对应于应用层 ,HTTP协议是基于TCP链接的

tcp协议: 对应于传输层

ip协议: 对应于网络层 
TCP/IP是传输层协议,主要解决数据如何在网络中传输;而HTTP是应用层协议,主要解决如何包装数据。

Socket是对TCP/IP协议的封装,Socket自己并非协议,而是一个调用接口(API),经过Socket,咱们才能使用TCP/IP协议。

http链接:http链接就是所谓的短链接,即客户端向服务器端发送一次请求,服务器端响应后链接即会断掉;

socket链接:socket链接就是所谓的长链接,理论上客户端和服务器端一旦创建起链接将不会主动断掉;可是因为各类环境因素可能会是链接断开,好比说:服务器端或客户端主机down了,网络故障,或者二者之间长时间没有数据传输,网络防火墙可能会断开该链接以释放网络资源。因此当一个socket链接中没有数据的传输,那么为了维持链接须要发送心跳消息~~具体心跳消息格式是开发者本身定义的

咱们已经知道网络中的进程是经过socket来通讯的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,均可以用“打开open –> 读写write/read –> 关闭close”模式来操做。个人理解就是Socket就是该模式的一个实现,socket便是一种特殊的文件,一些socket函数就是对其进行的操做(读/写IO、打开、关闭),这些函数咱们在后面进行介绍。咱们在传输数据时,能够只使用(传输层)TCP/IP协议,可是那样的话,若是没有应用层,便没法识别数据内容,若是想要使传输的数据有意义,则必须使用到应用层协议,应用层协议有不少,好比HTTP、FTP、TELNET等,也能够本身定义应用层协议。WEB使用HTTP协议做应用层协议,以封装HTTP文本信息,而后使用TCP/IP作传输层协议将它发到网络上。
1)Socket是一个针对TCP和UDP编程的接口,你能够借助它创建TCP链接等等。而TCP和UDP协议属于传输层 。
而http是个应用层的协议,它实际上也创建在TCP协议之上。(HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通讯的能力。)

2)Socket是对TCP/IP协议的封装,Socket自己并非协议,而是一个调用接口(API),经过Socket,咱们才能使用TCP/IP协议。Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而造成了咱们知道的一些最基本的函数接口。

47什么是TCP链接的三次握手

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时本身也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

握手过程当中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP链接一旦创建,在通讯双方中的任何一方主动关闭链接以前,TCP 链接都将被一直保持下去。断开链接时服务器和客户端都可以主动发起断开TCP链接的请求,断开过程须要通过“四次握手”(过程就不细写了,就是服务器和客户端交互,最终肯定断开)

48利用Socket创建网络链接的步骤

创建Socket链接至少须要一对套接字,其中一个运行于客户端,称为ClientSocket ,另外一个运行于服务器端,称为ServerSocket 。

套接字之间的链接过程分为三个步骤:服务器监听,客户端请求,链接确认。

1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待链接的状态,实时监控网络状态,等待客户端的链接请求。

2。客户端请求:指客户端的套接字提出链接请求,要链接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要链接的服务器的套接字,指出服务器端套接字的地址和端口号,而后就向服务器端套接字提出链接请求。

3。链接确认:当服务器端套接字监听到或者说接收到客户端套接字的链接请求时,就响应客户端套接字的请求,创建一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式创建链接。而服务器端套接字继续处于监听状态,继续接收其余客户端套接字的链接请求。

49Singleton(单例模式),也叫单子模式,是一种经常使用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。

代码以下:

static ClassA *classA = nil;//静态的该类的实例

+ (ClassA *)sharedManager{

  @synchronized(self) {

    if (!classA) {

      classA = [[super allocWithZone:NULL]init];

    }

  return classA;

  }

+ (id)allocWithZone:(NSZone *)zone {

  return [[self sharedManager] retain];

}

- (id)copyWithZone:(NSZone *)zone {

  return self;

}

- (id)retain {

  return self;

}

- (NSUIntger)retainCount {

  return NSUIntgerMax;

}

- (oneway void)release {

}

- (id)autorelease {

  return self;

}

-(void)dealloc{

}

50堆和栈上的指针

指针所指向的这块内存是在哪里分配的,在堆上称为堆上的指针,在栈上为栈上的指针。

在堆上的指针,能够保存在全局数据结构中,供不一样函数使用访问同一块内存。

在栈上的指针,在函数退出后,该内存即不可访问。

51什么是指针的释放?

具体来讲包括两个概念.

1 释放该指针指向的内存,只有堆上的内存才须要咱们手工释放,栈上不须要.

2 将该指针重定向为NULL.

52<1>数据结构中的指针?

其实就是指向一块内存的地址,经过指针传递,可实现复杂的内存访问.

<2> 函数指针?

指向一块函数的入口地址.

<3>指针做为函数的参数?

好比指向一个复杂数据结构的指针做为函数变量这种方法避免整个复杂数据类型内存的压栈出栈操做,提升效率.

注意:指针自己不可变,但指针指向的数据结构能够改变.

<4>指向指针的指针?

指针指向的变量是一个指针,即具体内容为一个指针的值,是一个地址.此时指针指向的变量长度也是4位.

52指针与地址的区别?

区别:

1指针意味着已经有一个指针变量存在,他的值是一个地址,指针变量自己也存放在一个长度为四个字节的地址当中,而地址概念自己并不表明有任何变量存在.

2 指针的值,若是没有限制,一般是能够变化的,也能够指向另一个地址.

地址表示内存空间的一个位置点,他是用来赋给指针的,地址自己是没有大小概念,指针指向变量的大小,取决于地址后面存放的变量类型.

53指针与数组名的关系?

其值都是一个地址,但前者是能够移动的,后者是不可变的.

<1>怎样防止指针的越界使用问题?

必须让指针指向一个有效的内存地址,

1 防止数组越界

2 防止向一块内存中拷贝过多的内容

3 防止使用空指针

4 防止改变const修改的指针

5 防止改变指向静态存储区的内容

6 防止两次释放一个指针

7 防止使用野指针.

<2> 指针的类型转换?

指针转换一般是指针类型和void * 类型以前进行强制转换,从而与指望或返回void指针的函数进行正确的交接.

54全局变量和局部变量在内存中是否有区别?若是有,是什么区别?

全局变量储存在静态数据库,局部变量储存在堆栈

55. 什么是平衡二叉树?
左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于1

56堆栈溢出通常是由什么缘由致使的?
没有回收垃圾资源

57Object-c的类能够多重继承么?能够实现多个接口么?Category是什么?重写一个类的方式用继承好仍是分类好?为何?
Object-c的类不能够多重继承;能够实现多个接口,经过实现多个接口能够完成C++的多重继承;Category是类别,通常状况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其余类与原有类的关系。

58#import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?
#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,至关于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,能够解决头文件的相互包含;#import<>用来包含系统的头文件,#import””用来包含用户头文件。

59属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么做用,在那种状况下用?
  1. readwrite 是可读可写特性;须要生成getter方法和setter方法时
  2. readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不但愿属性在类外改变
  3. assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
  4. retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
  5. copy 表示赋值特性,setter方法将传入对象复制一份;须要彻底一份新的变量时。
  6. nonatomic 非原子操做,决定编译器生成的setter getter是不是原子操做,atomic表示多线程安全,通常使用nonatomic

60写一个setter方法用于完成@property (nonatomic,retain)NSString *name,写一个setter方法用于完成@property(nonatomic,copy)NSString *name
  - (void) setName:(NSString*) str
  {
    [str retain];
    [name release];
    name = str;
  }
  - (void)setName:(NSString *)str
  {
    id t = [str copy];
    [name release];
    name = t;
  }

61对于语句NSString*obj = [[NSData alloc] init]; obj在编译时和运行时分别时什么类型的对象?
  编译时是NSString的类型;运行时是NSData类型的对象

62常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?如:NSInteger和int
  object-c的数据类型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,这些都是class,建立后即是对象,而C语言的基本数据类型int,只是必定字节的内存空间,用于存放数值;NSInteger是基本数据类型,并非NSNumber的子类,固然也不是NSObject的子类。NSInteger是基本数据类型Int或者Long的别名(NSInteger的定义typedef long NSInteger),它的区别在于,NSInteger会根据系统是32位仍是64位来决定是自己是int仍是Long。

63id 声明的对象有什么特性?
  Id 声明的对象具备运行时的特性,便可以指向任意类型的objcetive-c的对象;
64Objective-C如何对内存管理的,说说你的见解和解决方法?

  Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。
  1. (Garbage Collection)自动内存计数:这种方式和java相似,在你的程序的执行过程当中。始终有一个高人在背后准确地帮你收拾垃圾,你不用考虑它何时开始工做,怎样工做。你只须要明白,我申请了一段内存空间,当我再也不使用从而这段内存成为垃圾的时候,我就完全的把它忘记掉,反正那个高人会帮我收拾垃圾。遗憾的是,那个高人须要消耗必定的资源,在携带设备里面,资源是紧俏商品因此iPhone不支持这个功能。因此“Garbage Collection”不是本入门指南的范围,对“Garbage Collection”内部机制感兴趣的同窗能够参考一些其余的资料,不过说老实话“Garbage Collection”不大适合适初学者研究。
  解决: 经过alloc – initial方式建立的, 建立后引用计数+1, 此后每retain一次引用计数+1, 那么在程序中作相应次数的release就行了.
  2. (Reference Counted)手动内存计数:就是说,从一段内存被申请以后,就存在一个变量用于保存这段内存被使用的次数,咱们暂时把它称为计数器,当计数器变为0的时候,那么就是释放这段内存的时候。好比说,当在程序A里面一段内存被成功申请完成以后,那么这个计数器就从0变成1(咱们把这个过程叫作alloc),而后程序B也须要使用这个内存,那么计数器就从1变成了2(咱们把这个过程叫作retain)。紧接着程序A再也不须要这段内存了,那么程序A就把这个计数器减1(咱们把这个过程叫作release);程序B也再也不须要这段内存的时候,那么也把计数器减1(这个过程仍是release)。当系统(也就是Foundation)发现这个计数器变成了0,那么就会调用内存回收程序把这段内存回收(咱们把这个过程叫作dealloc)。顺便提一句,若是没有Foundation,那么维护计数器,释放内存等等工做须要你手工来完成。
  解决:通常是由类的静态方法建立的, 函数名中不会出现alloc或init字样, 如[NSString string]和[NSArray arrayWithObject:], 建立后引用计数+0, 在函数出栈后释放, 即至关于一个栈上的局部变量. 固然也能够经过retain延长对象的生存期.
  3. (NSAutoRealeasePool)内存池:能够经过建立和释放内存池控制内存申请和回收的时机.
  解决:是由autorelease加入系统内存池, 内存池是能够嵌套的, 每一个内存池都须要有一个建立释放对, 就像main函数中写的同样. 使用也很简单, 好比[[[NSString alloc]initialWithFormat:@”Hey you!”] autorelease], 即将一个NSString对象加入到最内层的系统内存池, 当咱们释放这个内存池时, 其中的对象都会被释放.


65 原子(atomic)跟非原子(non-atomic)属性有什么区别?
  1. atomic提供多线程安全。是防止在写未完成的时候被另一个线程读取,形成数据错误
  2. non-atomic:在本身管理内存的环境中,解析的访问器保留并自动释放返回的值,若是指定了 nonatomic ,那么访问器只是简单地返回这个值。

66看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢? 为何?
  =======================================================
  NSMutableArray* ary = [[NSMutableArray array] retain];
  NSString *str = [NSString stringWithFormat:@"test"];
  [str retain];
  [ary addObject:str];
  NSLog(@”%@%d”,str,[str retainCount]);
  [str retain];
  [str release];
  [str release];
  NSLog(@”%@%d”,str,[str retainCount]);
  [ary removeAllObjects];
  NSLog(@”%@%d”,str,[str retainCount]);
  =======================================================
  str的retainCount建立+1,retain+1,加入数组自动+1   3
  retain+1,release-1,release-1   2
  数组删除全部对象,全部数组内的对象自动-1  1

67内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象须要手动释放?在和property结合的时候怎样有效的避免内存泄露?

  谁申请,谁释放  遵循Cocoa Touch的使用原则;

  内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”须要注意@property设置特性时,必定要用对特性关键字,对于“内存泄漏”,必定要申请了要负责释放,要细心。关键字alloc 或new 生成的对象须要手动释放;设置正确的property属性,对于retain须要在合适的地方释放,

68如何对iOS设备进行性能测试?
  Profile-> Instruments ->Time Profiler

69Object C中建立线程的方法是什么?若是在主线程中执行代码,方法是什么?若是想延时执行代码、方法又是什么?
  线程建立有三种方法:使用NSThread建立、使用GCD的dispatch、使用子类化的NSOperation,而后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,若是想延时执行代码能够用performSelector:onThread:withObject:waitUntilDone:


70描述一下iOS SDK中如何实现MVC的开发模式
  MVC是模型、试图、控制开发模式,对于iOS SDK,全部的View都是视图层的,它应该独立于模型层,由视图控制层来控制。全部的用户数据都是模型层,它应该独立于视图。全部的ViewController都是控制层,由它负责控制视图,访问模型数据。

71什么是KVO和KVC?

  kvc:键 – 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是经过调用存取方法,直接或经过实例变量访问的机制。不少状况下能够简化程序代码。apple文档其实给了一个很好的例子。

  kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。

72OC的垃圾回收机制?

  OC2.0有Garbage collection,可是iOS平台不提供。通常咱们了解的objective-c对于内存管理都是手动操做的,可是也有自动释放池。可是差了大部分资料,貌似不要和arc机制搞混就行了。

73何时使用NSMutableArray,何时使用NSArray?
  当数组在程序运行时,须要不断变化的,使用NSMutableArray,当数组在初始化后,便再也不改变的,使用NSArray。须要指出的是,使用NSArray只代表的是该数组在运行时不发生改变,即不能往NSAarry的数组里新增和删除元素,但不代表其数组內的元素的内容不能发生改变。NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到NSMutableArray须要注意。

74 给出委托方法的实例,而且说出UITableVIew的Data Source方法
  CocoaTouch框架中用到了大量委托,其中UITableViewDelegate就是委托机制的典型应用,是一个典型的使用委托来实现适配器模式,其中UITableViewDelegate协议是目标,tableview是适配器,实现UITableViewDelegate协议,并将自身设置为talbeview的delegate的对象,是被适配器,通常状况下该对象是UITableViewController。
  UITableVIew的Data Source方法有:

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

75. 在应用中能够建立多少autorelease对象,是否有限制?
  无

76 若是咱们不建立内存池,是否有内存池提供给咱们?
  界面线程维护着本身的内存池,用户本身建立的数据线程,则须要建立该线程的内存池

77. 何时须要在程序中建立内存池?
  用户本身建立的数据线程,则须要建立该线程的内存池


78. 类NSObject的那些方法常常被使用?
  NSObject是Objetive-C的基类,其由NSObject类及一系列协议构成。
  其中类方法alloc、class、 description 对象方法init、dealloc、– performSelector:withObject:afterDelay:等常常被使用

79. 什么是简便构造方法?
  简便构造方法通常由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:
  Foundation下大部分类均有简便构造方法,咱们能够经过简便构造方法,得到系统给咱们建立好的对象,而且不须要手动释放。

80. 如何使用Xcode设计通用应用?
  使用MVC模式设计应用,其中Model层完成脱离界面,即在Model层,其是可运行在任何设备上,在controller层,根据iPhone与iPad(独有UISplitViewController)的不一样特色选择不一样的viewController对象。在View层,可根据现实要求,来设计,其中以xib文件设计时,其设置其为universal。

81. UIView的动画效果有那些?
  有不少,如 UIViewAnimationOptionCurveEaseInOut   UIViewAnimationOptionCurveEaseIn   UIViewAnimationOptionCurveEaseOut   UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight   UIViewAnimationOptionTransitionCurlUp  UIViewAnimationOptionTransitionCurlDown

82. 在iPhone应用中如何保存数据?
 有如下几种保存机制:
  1.经过web服务,保存在服务器上
  2.经过NSCoder固化机制,将对象保存在文件中
  3.经过SQlite或CoreData保存在文件数据库中

83. 什么是coredata?
  coredata是苹果提供一套数据保存框架,其基于SQlite

84. 什么是NSManagedObject模型?
  NSManagedObject是NSObject的子类 ,也是coredata的重要组成部分,它是一个通用的类,实现了core data 模型层所需的基本功能,用户可经过子类化NSManagedObject,创建本身的数据模型。

85. 什么是NSManagedobjectContext?
  NSManagedobjectContext对象负责应用和数据库之间的交互。

86. 什么是谓词?
  谓词是经过NSPredicate,是经过给定的逻辑条件做为约束条件,完成对数据的筛选。
  predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n];
  a = [customers filteredArrayUsingPredicate:predicate];

87. 和coredata一块儿有哪几种持久化存储机制?
  存入到文件、 存入到NSUserDefaults(系统plist文件中)、存入到Sqlite文件数据库

88. 谈谈对Block 的理解?并写出一个使用Block执行UIVew动画?
  Block是能够获取其余函数局部变量的匿名函数,其不但方便开发,而且能够大幅提升应用的执行效率(多核心CPU可直接处理Block指令)
  [UIView transitionWithView:self.view
            duration:0.2
            options:UIViewAnimationOptionTransitionFlipFromLeft
           animations:^{

                 [[blueViewController view] removeFromSuperview]; [[self view] insertSubview:yellowViewController.view atIndex:0];

                }
  completion:NULL];

89. 写出上面代码的Block的定义。
  typedef void(^animations) (void);
  typedef void(^completion) (BOOL finished);

90. 作过的项目是否涉及网络访问功能,使用什么对象完成网络功能?
  ASIHTTPRequest与NSURLConnection,AFNetworking与NSURLConnection、NSURLSession

91. 简单介绍下NSURLConnection类及+ sendSynchronousRequest:returningResponse:error:与– initWithRequest:delegate:两个方法的区别?
   NSURLConnection主要用于网络访问,其中+ sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前线程会阻塞,并等待request的返回的response;而– initWithRequest:delegate:使用的是异步加载,当其完成网络访问后,会经过delegate回到主线程,并其委托的对象。

92. 多线程是什么
  多线程是个复杂的概念,按字面意思是同步完成多项任务,提升了资源的使用效率,从硬件、操做系统、应用软件不一样的角度去看,多线程被赋予不一样的内涵,对于硬件,如今市面上多数的CPU都是多核的,多核的CPU运算多线程更为出色;从操做系统角度,是多任务,如今用的主流操做系统都是多任务的,能够一边听歌、一边写博客;对于应用来讲,多线程可让应用有更快的回应,能够在网络下载时,同时响应用户的触摸操做。在iOS应用中,对多线程最初的理解,就是并发,它的含义是原来先作烧水,再摘菜,再炒菜的工做,会变成烧水的同时去摘菜,最后去炒菜。

93. iOS 中的多线程
  iOS中的多线程,是Cocoa框架下的多线程,经过Cocoa的封装,可让咱们更为方便的使用线程,作过C++的同窗可能会对线程有更多的理解,好比线程的创立,信号量、共享变量有认识,Cocoa框架下会方便不少,它对线程作了封装,有些封装,可让咱们建立的对象,自己便拥有线程,也就是线程的对象化抽象,从而减小咱们的工程,提供程序的健壮性。
  GCD是(Grand Central Dispatch)的缩写 ,从系统级别提供的一个易用地多线程类库,具备运行时的特色,能充分利用多核心硬件。GCD的API接口为C语言的函数,函数参数中多数有Block,关于Block的使用参看这里,为咱们提供强大的“接口”,对于GCD的使用参见本文
  NSOperation与Queue
  NSOperation是一个抽象类,它封装了线程的细节实现,咱们能够经过子类化该对象,加上NSQueue来同面向对象的思惟,管理多线程程序。具体可参看这里:一个基于NSOperation的多线程网络访问的项目。
  NSThread
  NSThread是一个控制线程执行的对象,它不如NSOperation抽象,经过它咱们能够方便的获得一个线程,并控制它。但NSThread的线程之间的并发控制,是须要咱们本身来控制的,能够经过NSCondition实现。
  参看 iOS多线程编程之NSThread的使用
  其余多线程
  在Cocoa的框架下,通知、Timer和异步函数等都有使用多线程,(待补充).

94. 在项目何时选择使用GCD,何时选择NSOperation?
  项目中使用NSOperation的优势是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具备面向对象的优势(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
  项目中使用GCD的优势是GCD自己很是简单、易用,对于不复杂的多线程操做,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。

95. 什么是block
  对于闭包(block),有不少定义,其中闭包就是可以读取其它函数内部变量的函数,这个定义即接近本质又较好理解。对于刚接触Block的同窗,会以为有些绕,由于咱们习惯写这样的程序main(){ funA();} funA(){funB();} funB(){…..}; 就是函数main调用函数A,函数A调用函数B… 函数们依次顺序执行,但现实中不全是这样的,例如项目经理M,手下有3个程序员A、B、C,当他给程序员A安排实现功能F1时,他并不等着A完成以后,再去安排B去实现F2,而是安排给A功能F1,B功能F2,C功能F3,而后可能去写技术文档,而当A遇到问题时,他会来找项目经理M,当B作完时,会通知M,这就是一个异步执行的例子。在这种情形下,Block即可大显身手,由于在项目经理M,给A安排工做时,同时会告诉A若果遇到困难,如何能找到他报告问题(例如打他手机号),这就是项目经理M给A的一个回调接口,要回掉的操做,好比接到电话,百度查询后,返回网页内容给A,这就是一个Block,在M交待工做时,已经定义好,而且取得了F1的任务号(局部变量),倒是在当A遇到问题时,才调用执行,跨函数在项目经理M查询百度,得到结果后回调该block。


96. block 实现原理
  Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。
  从计算语言的发展,最先的goto,高级语言的指针,到面向对象语言的block,从机器的思惟,一步步接近人的思惟,以方便开发人员更为高效、直接的描述出现实的逻辑(需求)。

97.Sizeof 和strlen 的区别和联系?

 

Sizeof() 是运算符,能够用类型作参数,还能够用函数作参数,功能是得到保证能容纳实现所创建的最大对象的字节大小;

 

strlen()是函数,要在运行时才能计算。参数必须是字符行指针且必须是以”\0″结尾的。功能为:返回字符串的的长度。

98.关键字volatile有什么含义?并给出三个不一样例子?
  volatile:易变的
  通常说来,volatile用在以下的几个地方:
    一、中断服务程序中修改的供其它程序检测的变量须要加volatile;
    二、多任务环境下各任务间共享的标志应该加volatile;
    三、存储器映射的硬件寄存器一般也要加volatile说明,由于每次对它的读写均可能有不一样意义;
  另外,以上这几种状况常常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在
    1中能够经过关中断来实现,
    2中能够禁止任务调度,
    3中则只能依靠硬件的良好设计了

99.objective-c中是如何实现线程同步的?

  Mutexlock (互斥锁)、NSCondition lock (条件锁)消息传送

100.这段代码有什么问题吗:

@implementation Person

- (void)setAge:(int)newAge {

  self.age = newAge;

}

@end

正确写法

{

  if(_age){

    [_age release];

  }

  _age = [newAge retain];

}

死循环(扩展:知道如何正确写setter和getter方法)

 101.这段代码有什么问题,如何修改

for (int i = 0; i < someLargeNumber; i++) { 

  NSString *string = @”Abc”;//常量区

  string = [string lowercaseString];//新的堆区

  string = [string stringByAppendingString:@"xyz"];//新的堆区

  NSLog(@“%@”, string);

}

在for循环里添加自动释放池(扩展:常量区的retaincount是怎么个状况)

会出现内存泄漏

for (int i = 0; i < someLargeNumber; i++) { 

  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

  NSString *string = @”Abc”;//常量区

  string = [string lowercaseString];//新的堆区

  string = [string stringByAppendingString:@"xyz"];//新的堆区

  NSLog(@“%@”, string);

  //释放池

  [pool drain];

}

102.截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的数据,分别输出它们。

NSString * str = @“20|http://www.baidu.com”;

for(NSString*s in [str componentsSeparatedByString:@"|"]){

  NSLog(@“%@“,s);

}

103.用obj-c写一个冒泡排序  

for (int i = 0, i < arr.count - 1,i++){
  for  (int j = 0,j < arr.count - 1 - i;j++){
    int a = [[arr objectAtIndex:j]intValue];
    int b=[[arr objectAtIndex:j+1]intValue];
    if (a < b){
      [arr replaceObjectAtIndex:j withObject:[NSString stringWithFormat:@“%d”,b]];
      [arr replaceObjectAtIndex:j+1 withObject:[NSString stringWithFormat:@“%d”,a];
    }
  }
}
104.简述你对UIView、UIWindow和CALayer的理解
UIWindow对象是全部UIView的根,管理和协调的应用程序的显示。UIWindow类是UIView的子类,能够看做是特殊的UIView。通常应用程序只有一个UIWindow对象,即便多个UIWindow对象,也只有一个UIWindow能够接受到用户的触屏事件。
UIView是用来显示内容的,能够处理用户事件。
CALayer是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。
UIView和CALayer是相互依赖的关系。UIView依赖与calayer提供的内容,CALayer依赖uivew提供的容器来显示绘制的内容。归根到底CALayer是这一切的基础,若是没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。UIView来自CALayer,高于CALayer,是CALayer高层实现与封装。UIView的全部特性来源于CALayer支持。
 
105.分析json、xml的区别?json、xml解析方式的底层是如何处理的?

1.数据交换格式比较之关于XML和JSON:

XML:extensible markup language,一种相似于HTML的语言,他没有预先定义的标签,使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。具体的能够问Google或百度。相比之JSON这种 轻量级的数据交换格式,XML能够称为重量级的了。

JSON : JavaScript Object Notation 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language , Standard ECMA-262 3rd Edition – December 1999 的一个子集。 JSON采用彻底独立于语言的文本格式,可是也使用了相似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

2.数据交换格式比较之关于轻量级和重量级:

轻量级和重量级是相对来讲的,那么XML相对于JSON的重量级体如今哪呢?我想应该体如今解析上,XML目前设计了两种解析方式:DOM和SAX;

DOM是把一个数据交换格式XML当作一个DOM对象,须要把XML文件整个读入内存,这一点上JSON和XML的原理是同样的,可是XML要考虑 父节点和子节点,这一点上JSON的解析难度要小不少,由于JSON构建于两种结构:key/value,键值对的集合;值的有序集合,可理解为数组;

SAX不须要整个读入文档就能够对解析出的内容进行处理,是一种逐步解析的方法。程序也能够随时终止解析。这样,一个大的文档就能够逐步的、一点一点的展示出来,因此SAX适合于大规模的解析。这一点,JSON目前是作不到得。

因此,JSON和XML的轻/重量级的区别在于:JSON只提供总体解析方案,而这种方法只在解析较少的数据时才能起到良好的效果;而XML提供了对大规模数据的逐步解析方案,这种方案很适合于对大量数据的处理。

3.数据交换格式比较之关于数据格式编码及解析的难度:

在编码上,虽然XML和JSON都有各自的编码工具,可是JSON的编码要比XML简单,即便不借助工具,也能够写出JSON代码,但要写出好的 XML代码就有点困难;与XML同样,JSON也是基于文本的,且它们都使用Unicode编码,且其与数据交换格式XML同样具备可读性。

主观上来看,JSON更为清晰且冗余更少些。JSON网站提供了对JSON语法的严格描述,只是描述较简短。从整体来看,XML比较适合于标记文档,而JSON却更适于进行数据交换处理。

在解析上,在普通的web应用领域,开发者常常为XML的解析伤脑筋,不管是服务器端生成或处理XML,仍是客户端用 JavaScript 解析XML,都经常致使复杂的代码,极低的开发效率。

实际上,对于大多数web应用来讲,他们根本不须要复杂的XML来传输数据,XML宣称的扩展性在此就不多具备优点;许多Ajax应用甚至直接返回 HTML片断来构建动态web页面。和返回XML并解析它相比,返回HTML片断大大下降了系统的复杂性,但同时缺乏了必定的灵活性。同XML或HTML 片断相比,数据交换格式JSON 提供了更好的简单性和灵活性。在web serivice应用中,至少就目前来讲XML仍有不可动摇的地位。

106cobj-c如何混用
1)obj-c的编译器处理后缀为m的文件时,能够识别obj-c和c的代码,处理mm文件能够识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,并且cpp文件include的头文件中,也不能出现obj-c的代码,由于cpp只是cpp
 2) 在mm文件中混用cpp直接使用便可,因此obj-c混cpp不是问题
 3)在cpp中混用obj-c其实就是使用obj-c编写的模块是咱们想要的。
 若是模块以类实现,那么要按照cpp class的标准写类的定义,头文件中不能出现obj-c的东西,包括#import cocoa的。实现文件中,即类的实现代码中能够使用obj-c的东西,能够import,只是后缀是mm。
 若是模块以函数实现,那么头文件要按c的格式声明函数,实现文件中,c++函数内部能够用obj-c,但后缀仍是mm或m。
总结:只要cpp文件和cpp include的文件中不包含obj-c的东西就能够用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是obj-c编译后的o文件,这个东西实际上是无差异的,因此能够用。obj-c的编译器支持cpp.

107.功能列表:框架分类
下面是 Cocoa Touch 中一小部分可用的框架:
音频和视频
Core Audio
OpenAL
Media Library
AV Foundation
数据管理
Core Data
SQLite
图形和动画
Core Animation
OpenGL ES
Quartz 2D
网络/li>
Bonjour
WebKit
BSD Sockets
用户应用
Address Book
Core Location
Map Kit
Store Kit

108简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?
本身能够写个demo来测试一下
进入后台时
-(void)applicationWillResignActive:(UIApplication *)application;
-(void)applicationDidEnterBackground:(UIApplication *)application;
进入前台时
-(void)applicationDidEnterForeground:(UIApplication *)application;
-(void)applicationWillResignActive:(UIApplication *)application;

109.ViewController 的 alloc,loadView, viewDidLoad,viewWillAppear,viewDidUnload,dealloc、init分别是在何时调用的?在自定义ViewController的时候这几个函数里面应该作什么工做?
alloc申请内存时调用
loadView加载视图时调用
ViewDidLoad视图已经加载后调用
ViewWillAppear视图将要出现时调用
ViewDidUnload视图已经加载但没有加载出来调用
dealloc销毁该视图时调用
init视图初始化时调用

110.UIImage初始化一张图片有几种方法?简述各自的优缺点。
3种
imageNamed:系统会先检查系统缓存中是否有该名字的Image,若是有的话,则直接返回,若是没有,则先加载图像到缓存,而后再返回。
initWithContentsOfFile:系统不会检查系统缓存,而直接从文件系统中加载并返回。
imageWithCGImage:scale:orientation当scale=1

111.类变量的@protected ,@private,@public,@package,声明各有什么含义?

         @private:做用范围只能在自身类

         @protected:做用范围在自身类和继承本身的子类 (默认)

         @public:做用范围最大,能够在任何地方被访问。

         @package:这个类型最经常使用于框架类的实例变量,同一包内能用,跨包就不能访问

1十二、线程是什么?进程是什么?两者有什么区别和联系?

   一个程序至少有一个进程,一个进程至少有一个线程.

         进程:一个程序的一次运行,在执行过程当中拥有独立的内存单元,而多个线程共享一块内存

         线程:线程是指进程内的一个执行单元。

   联系:线程是进程的基本组成单位

   区别:(1)调度:线程做为调度和分配的基本单位,进程做为拥有资源的基本单位


    (2)并发性:不只进程之间能够并发执行,同一个进程的多个线程之间也可并发执行


    (3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但能够访问隶属于进程的资源.


      (4)系统开销:在建立或撤消进程时,因为系统都要为之分配和回收资源,致使系统的开销明显大于建立或撤消线程时的开销。

         举例说明:操做系统有多个软件在运行(QQ、office、音乐等),这些都是一个个进程,而每一个进程里又有好多线程(好比QQ,你能够同时聊天,发送文件等)

11三、谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?

   好处:

         1.使用线程能够把占据时间长的程序中的任务放到后台去处理

         2.用户界面能够更加吸引人,这样好比用户点击了一个按钮去触发某些事件的处理,能够弹出一个进度条来显示处理的进度

         3.程序的运行速度可能加快

         4·在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。

  缺点:

         1.若是有大量的线程,会影响性能,由于操做系统须要在它们之间切换。

         2.更多的线程须要更多的内存空间。

         3.线程的停止须要考虑其对程序运行的影响。

         4.一般块模型数据是在多个线程间共享的,须要防止线程死锁状况的发生。

实现多线程的方法:

        NSObject类方法

         NSThread

         NSOperation

         GCD

11四、线程同步和异步的区别?IOS中如何实现多线程的同步?

         异步:举个简单的例子 就是游戏,游戏会有图像和背景音乐

         同步:是指一个线程要等待上一个线程执行完以后才开始执行当前的线程,上厕所

         NSOperationQueue:maxcurrentcount

         NSConditionLock

11五、假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,即上述字符串处理以后的输出结果为:aabcd

  NSMutableString * str = [[NSMutableString alloc]initWithFormat;@“aabcad”];

         for (int i = 0 ,i < str.length - 1 ;i++){

           unsigned char a = [str characterAtIndex:i];

           for (int j = i + 1 ,j < str.length ,j++){

             unsigned char b = [str characterAtIndex:j];

             if (a == b ){

               if (j == i + 1){

               }

          else{

               [str deleteCharactersInRange:NSMakeRange(j, 1)];

               }

             }

           }

         }

      NSLog(@“%@”,str);

11六、获取一台设备惟一标识的方法有哪些?

         (1)UDID

         (2)UUID

         (3)MAC Address

         (4)OPEN UDID

         (5)广告标识符

         (6)Vindor标示符

117.写出方法获取iOS内存使用状况。

         // 获取当前设备可用内存及所占内存的头文件

         #import

         #import

         // 获取当前设备可用内存(单位:MB)

         - (double)availableMemory

         {

         vm_statistics_data_t vmStats;

         mach_msg_type_number_t infoCount = HOST_VM_INFO_COUNT;

         kern_return_t kernReturn = host_statistics(mach_host_self(),

         HOST_VM_INFO,

         (host_info_t)&vmStats,

         &infoCount);

         if (kernReturn != KERN_SUCCESS) {

         return NSNotFound;

         }

         return ((vm_page_size *vmStats.free_count) / 1024.0) / 1024.0;

        }

         // 获取当前任务所占用的内存(单位:MB)

        - (double)usedMemory

         {

         task_basic_info_data_t taskInfo;

         mach_msg_type_number_t infoCount = TASK_BASIC_INFO_COUNT;

         kern_return_t kernReturn = task_info(mach_task_self(),

         TASK_BASIC_INFO,

         (task_info_t)&taskInfo,

         &infoCount);

         if (kernReturn != KERN_SUCCESS

         ) {

         return NSNotFound;

         }

         return taskInfo.resident_size / 1024.0 / 1024.0;

         }

118.介绍XMPP协议原理及相关信息。

XMPP协议简介  

XMPP(Extensible Messageing and Presence Protocol:可扩展消息与存在协议)是目前主流的四种IM(IM:instant messaging,即时消息)协议之一,其余三种分别为:即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通信和空间平衡扩充的进程开始协议SIP(SIMPLE)。在这四种协议中,XMPP是最灵活的。XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。所以,基于XMPP的应用具备超强的可扩展性。通过扩展之后的XMPP能够经过发送扩展的信息来处理用户的需求,以及在XMPP的顶端创建如内容发布系统和基于地址的服务等应用程 序。并且,XMPP包含了针对服务器端的软件协议,使之能与另外一个进行通话,这使得开发者更容易创建客户应用程序或给一个配好系统添加功能。

<1> 什么是XMPP ?

XMPP的前身是Jabber,一个开源形式组织产生的网络即时通讯协议。XMPP目前被IETF国际标准组织完成了标准化工做。标准化的核心结果分为两部分; 核心的XML流传输协议 基于XML流传输的即时通信扩展应用 XMPP的核心XML流传输协议的定义使得XMPP可以在一个比以往网络通讯协议更规范的平台上。借助于XML易于解析和阅读的特性,使得XMPP的协议可以很是漂亮。 XMPP的即时通信扩展应用部分是根据IETF在这以前对即时通信的一个抽象定义的,与其余业已获得普遍使用的即时通信协议,诸如AIM,QQ等有功能完整,完善等先进性。

<2>XMPP的基本网络结构是怎样的

XMPP中定义了三个角色,客户端,服务器,网关。通讯可以在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,链接管理和信息的路由功能。网关承担着与异构即时通讯系统的互联互通,异构系统能够包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端经过TCP/IP链接到单服务器,而后在之上传输XML。

<3> XMPP经过TCP传什么了?

传输的是与即时通信相关的指令。在之前这些命令要么用2进制的形式发送(好比QQ),要么用纯文本指令加空格加参数加换行苻的方式发送(好比MSN)。而XMPP传输的即时通信指令的逻辑与以往相仿,只是协议的形式变成了XML格式的纯文本。这不但使得解析容易了,人也容易阅读了,方便了开发和查错。而XMPP的核心部分就是一个在网络上分片段发送XML的流协议。这个流协议是XMPP的即时通信指令的传递基础,也是一个很是重要的能够被进一步利用的网络基础协议。因此能够说,XMPP用TCP传的是XML流。

XMPP协议工做原理:

 

<4> XMPP协议地址格式:

 

 

<5> XMPP消息格式: 

 

 

 

 

 

 

 

<6> 核心的XML流传输协议

基于XML FreeEIM流传输的即时通信扩展应用

XMPP的核心XML流传输协议的定义使得XMPP可以在一个比以往网络通讯协议更规范的平台上。借助于XML易于解析和阅读的特性,使得XMPP的协议可以很是漂亮。

XMPP的即时通信扩展应用部分是根据IETF在这以前对即时通信的一个抽象定义的,与其余业已获得普遍使用的即时通信协议,诸如AIM,QQ等有功能完整,完善等先进性。

XMPP的扩展协议Jingle使得其支持语音和视频。 

XMPP的官方文档时RFC 3920. 

<7> XMPP应用示例

举个例子看看所谓的XML流是什么样子的?

  客户端:<?xml version='1.0'?>
 
  <stream:stream
 
  to='example_com'
 
  xmlns='jabber:client'
 
  xmlns:stream='http_etherx_jabber_org/streams'
 
  version='1.0'>
 
  服务器:<?xml version='1.0'?>
 
  <stream:stream
 
  from='example_com'
 
  id='someid'
 
  xmlns='jabber:client'
 
  xmlns:stream='http_etherx_jabber_org/streams'
 
  version='1.0'>
 
  ...其余通讯...
 
  客户端:<message from='juliet_example_com'
 
  to='romeo_example_net'
 
  xml:lang='en'>
 
  客户端: <body>Art thou not Romeo, and a Montague?</body>
 
  客户端:</message>
 
  服务器:<message from='romeo_example_net'
 
  to='juliet_example_com'
 
  xml:lang='en'>
 
  服务器:<body>Neither, fair saint, if either thee dislike.</body>
 
  服务器:</message>
 
  客户端:</stream:stream>
 

  服务器:</stream:stream> 

以文档的观点来看,客户端或服务器发送的全部XML文本连缀在一块儿,从<stream>到</stream>构成了一个完整的XML文档。其中的stream标签就是所谓的XML Stream。在<stream>与</stream>中间的那些<message>...</message>这样的XML元素就是所谓的XML Stanza(XML节)。XMPP核心协议通讯的基本模式就是先创建一个stream,而后协商一堆安全之类的东西,中间通讯过程就是客户端发送XML Stanza,一个接一个的。服务器根据客户端发送的信息以及程序的逻辑,发送XML Stanza给客户端。可是这个过程并非一问一答的,任什么时候候都有可能从一方发信给另一方。通讯的最后阶段是</stream>关闭流,关闭TCP/IP链接。 

<8>XMPP系统特色:

1)客户机/服务器通讯模式;(2)分布式网络;(3)简单的客户端;(4)XML的数据格式。 

<9>通俗解释:

其实XMPP 是一种很相似于http协议的一种数据传输协议,它的过程就如同“解包装--〉包装”的过程,用户只须要明白它接受的类型,并理解它返回的类型,就能够很好的利用xmpp来进行数据通信。

相关文章
相关标签/搜索