ios面试笔记

delegate和notification区别,分别在什么状况下使用?java

Delegate:linux

消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate赞成然而后发送者响应事件,delegate机制使得接收者能够改变发送者的行为。一般发送者和接收者的关系是直接的一对一的关系。ios

Notification:c++

消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。一般发送者和接收者的关系是间接的一对多或者多对多关系。程序员

总结:三点web

1.两者都用于传递消息,不一样之处主要在于一个是一对一的,另外一个是一对多或者多对多的。sql

2.delegate须要二者之间必须创建联系,否则无法调用代理的方法;notification不须要二者之间有联系,notification经过维护一个array,实现一对多消息的转发。两个模块之间联系不是很紧密,就用notification传值,例如多线程之间传值用notificaiton。delegate只是一种较为简单的回调,且主要用在一个模块中,例如底层功能完成了,须要把一些值传到上层去,就事先把上层的函数经过delegate传到底层,而后在底层call这个delegate,它们都在一个模块中,完成一个功能,例如说 NavgationController 从 B 界面到A 点返回按钮 (调用popViewController方法) 能够用delegate比较好。数据库

3. 效率确定是delegate比nsnotification高。编程

4. delegate方法比notification更加直接,最典型的特征是,delegate方法每每须要关注返回值,也就是delegate方法的结果。好比-windowShouldClose:,须要关心返回的是yes仍是no。,根据返回值来决定如何作下一步.因此delegate方法每每包含should这个很传神的词。相反的,notification最大的特点就是不关心接受者的态度,我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。因此notification每每用did这个词汇,好比NSWindowDidResizeNotification,那么nswindow对象放出这个notification后就什么都无论了也不会等待接受者的反应。设计模式

3六、你是如何理解delegate?

delegate,又称为委托或者代理,它是一种设计模式,delegate主要用于两个对象之间的通讯交互,而且解除两个通讯对象的耦合性,IOS中大量使用了delegate设计,主要用于视图与适用对象之间的通讯交互。

delegate notification kvo三者比较

三种模式都是一个对象传递事件给另一个对象,而且不要他们有耦合。三种模式都是对象来通知某个事件发生了的方法,或者更准确的说,是容许其余的对象收到这种事件的方法。

  delegation 

delegation的基本特征是,一个controller定义了一个协议(即一系列的方法定义)。该协议描述了一个delegate对象为了可以响应一个controller的事件而必须作的事情。协议就是delegator说,“若是你想做为个人delegate,那么你就必须实现这些方法”。实现这些方法就是容许controller在它的delegate可以调用这些方法,而它的delegate知道何时调用哪一种方法。delegate能够是任何一种对象类型,所以controller不会与某种对象进行耦合,可是当该对象尝试告诉委托事情时,该对象能肯定delegate将响应。

delegate的优点:

  1.很是严格的语法。全部将听到的事件必须是在delegate协议中有清晰的定义。

2.若是delegate中的一个方法没有实现那么就会出现编译警告/错误

  3.协议必须在controller的做用域范围内定义

  4.在一个应用中的控制流程是可跟踪的而且是可识别的;

  5.在一个控制器中能够定义定义多个不一样的协议,每一个协议有不一样的delegates

  6.没有第三方对象要求保持/监视通讯过程。

7.可以接收调用的协议方法的返回值。这意味着delegate可以提供反馈信息给controller

  缺点:

1.须要定义不少代码:1).协议定义;2).controller的delegate属性;3).在delegate自己中实现delegate方法定义

  2.在释放代理对象时,须要当心的将delegate改成nil。一旦设定失败,那么调用释放对象的方法将会出现内存crash

3.在一个controller中有多个delegate对象,而且delegate是遵照同一个协议,但仍是很难告诉多个对象同一个事件,不过有可能。

notification 

IOS应用开发中有一个”Notification Center“的概念。它是一个单例对象,容许当事件发生时通知一些对象。它容许咱们在低程度耦合的状况下,知足控制器与一个任意的对象进行通讯的目的。这种模式的基本特征是为了让其余的对象可以接收到在该controller中发生某种事件而产生的消息,controller用一个key(通知名称)。这样对于controller来讲是匿名的,其余的使用一样的key来注册了该通知的对象(即观察者)可以对通知的事件做出反应。

优点

1.不须要编写多少代码,实现比较简单;

2.对于一个发出的通知,多个对象可以作出反应,即1对多的方式实现简单

3.controller可以传递context对象(dictionary),context对象携带了关于发送通知的自定义的信息

缺点:

1.在编译期不会检查通知是否可以被观察者正确的处理;

2.在释放注册的对象时,须要在通知中心取消注册;

  3.在调试的时候应用的工做以及控制过程难跟踪;

  4.须要第三方对喜好那个来管理controller与观察者对象之间的联系;

5.controller和观察者须要提早知道通知名称、UserInfo dictionary keys。若是这些没有在工做区间定义,那么会出现不一样步的状况;

  6.通知发出后,controller不能从观察者得到任何的反馈信息。

KVO 

 KVO是一个对象可以观察另一个对象的属性的值,而且可以发现值的变化。前面两种模式更加适合一个controller与任何其余的对象进行通讯,而KVO更加适合任何类型的对象侦听另一个任意对象的改变(这里也能够是controller,但通常不是controller)。这是一个对象与另一个对象保持同步的一种方法,即当另一种对象的状态发生改变时,观察对象立刻做出反应。它只能用来对属性做出反应,而不会用来对方法或者动做做出反应。

优势

1.可以提供一种简单的方法实现两个对象间的同步。例如:model和view之间同步;

2.可以对非咱们建立的对象,即内部对象的状态改变做出响应,并且不须要改变内部对象(SKD对象)的实现;

3.可以提供观察的属性的最新值以及先前值;

4.用key paths来观察属性,所以也能够观察嵌套对象;

5.完成了对观察对象的抽象,由于不须要额外的代码来容许观察值可以被观察

缺点:

1.咱们观察的属性必须使用strings来定义。所以在编译器不会出现警告以及检查;

2.对属性重构将致使咱们的观察代码再也不可用;

3.复杂的“IF”语句要求对象正在观察多个值。这是由于全部的观察代码经过一个方法来指向;

4.当释放观察者时不须要移除观察者。

使用任何一种模式都没有对和错,只有更适合或者不适合。每一种模式都给对象提供一种方法来通知一个事件给其余对象,并且前者不须要知道侦听者。在这三种模式中,我认为KVO有最清晰的使用案例,并且针对某个需求有清晰的实用性。而另外两种模式有比较类似的用处,而且常常用来给controller间进行通讯。

使用命名规则好的协议和协议方法定义对于清晰的理解controllers间的通讯是很容易的。努力的定义这些协议方法将加强代码的可读性,以及更好的跟踪你的app。代理协议发生改变以及实现均可经过编译器检查出来,若是没有将会在开发的过程当中至少会出现crash,而不只仅是让一些事情异常工做。甚至在同一事件通知多控制器的场景中,只要你的应用在controller层次有着良好的结构,消息将在该层次上传递。该层次可以向后传递直至让全部须要知道事件的controllers都知道。固然会有delegation模式不适合的例外状况出现,并且notification可能更加有效。例如:应用中全部的controller须要知道一个事件。然而这些类型的场景不多出现。另一个例子是当你创建了一个架构并且须要通知该事件给正在运行中应用。

 

 1 使用block和使用delegate完成委托模式有什么优势?

  首先要了解什么是委托模式,委托模式在iOS中大量应用,其在设计模式中是适配器模式中的对象适配器,Objective-C中使用id类型指向一切对象,使委托模式更为简洁。了解委托模式的细节:

  iOS设计模式—-委托模式

  使用block实现委托模式,其优势是回调的block代码块定义在委托对象函数内部,使代码更为紧凑;

  适配对象再也不须要实现具体某个protocol,代码更为简洁。

 

七、block与函数有何异同,block有何优势

1>block相似于c里面的函数指针,均可以做为参数进行传递,用于回调,但block的定义能够在方法中,函数则不能够。

2>block语法简洁,能够在方法中定义实现,这样能够访问方法中的局部变量,使代码更加紧靠,结构简化。

1三、Block在内存管理上的特色,须要注意循环引用,如何解决循环引用

1>、block块中使用了局部对象,则会将此对象retain,引用了当前对象的属性或者方法,则会将当前对象retain

2>、解决循环引用:将当前对象赋给一个局部变量,而且使用__block关键字修饰局部变量,使用该变量访问对象的属性和方法

 

 2 多线程与block

  GCD与Block

  使用 dispatch_async 系列方法,能够以指定的方式执行block

  GCD编程实例

  dispatch_async的完整定义

  void dispatch_async(

  dispatch_queue_t queue,

  dispatch_block_t block);

  功能:在指定的队列里提交一个异步执行的block,不阻塞当前线程

经过queue来控制block执行的线程。主线程执行前文定义的 finishBlock对象  dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();});

 

__block和__weak修饰符的区别实际上是挺明显的: 

1.__block无论是ARC仍是MRC模式下均可以使用,能够修饰对象,还能够修饰基本数据类型。 

2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。 

3.__block对象能够在block中被从新赋值,__weak不能够。 

 

 tableView 滑动卡的问题主要是由于:从缓存中或者是从本地读取图片给UIImage的时候耗费的时间。须要把下面的两句话放到子线程里面:

  1. 1 NSData *imgData = [NSData dataWithContentsOfURL:[NSURL URLWithString:app.icon]]; //获得图像数据  
  2. 2         UIImage *image = [UIImage imageWithData:imgData];  

 

把UIImage赋值给图片的时候在主线程。

子线程不能更新UI 全部的UI跟新都是主线程执行了。手指滑动屏幕了。或者屏幕的某个方法执行了。

 

子线程里面加入NSTimer 的时候须要 手动添加NSRunloop   不然不能循环。

 

单利里面添加 NSMutableArray 的时候,防止多个地方对它同时便利和修改的话,须要加原子属性。而且用strong,,,而且写一个遍历和修改的方法。加上锁。   Lock   UnLock    

 

    __weak ViewController*  weakSelf = self;

GCD里面用 __weak 防止内存释放不了,循环引用。

 

 

 

UIViewController的生命周期

答:当一个视图控制器被建立,并在屏幕上显示的时候。 代码的执行顺序

      // 视图显示在屏幕上的顺序

     一、 alloc                    建立对象,分配空间。

    二、init (initWithNibName)    初始化对象,初始化数据。

    三、loadView                   从nib载入视图, 这一步不须要去干涉。除非没有使用xib文件建立视图。

    四、viewDidLoad                加载完毕,能够进行自定义数据以及动态建立其余控件。

    五、viewWillAppear             视图将出如今屏幕以前,立刻这个视图即将显示在屏幕上。

   六、viewDidAppear              视图已在屏幕上渲染完成。

 

    // 视图将被从屏幕上移除的顺序

    一、viewWillDisappear          视图将被从屏幕上移除以前执行。

    二、viewDidDisappear           视图已经被从屏幕上移除。

 

    三、dealloc                    视图被销毁,此时须要在init和viewDidLoad中建立的对象进行释放。

    四、viewDidUnload              出现内存警告在内存不足时执行,并对全部非当前显示的controller执行。

     本视图的全部子视图将被销毁,以释放内存,此时开发者须要手动对viewLoad、viewDidLoad中建立的对象释放内存。

由于当这个视图再次显示在屏幕上的时候,viewLoad、viewDidLoad 再次被调用,以便再次构造视图

 

 

16.属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么做用,在那种状况下用?

 答:readwrite 是可读可写特性;须要生成getter方法和setter方法时

readonly 是只读特性  只会生成getter方法 不会生成setter方法 ;不但愿属性在类外改变

assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;

retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1; 

copy 表示赋值特性,setter方法将传入对象复制一份;须要彻底一份新的变量时。

nonatomic 非原子操做,决定编译器生成的setter getter是不是原子操做,atomic表示多线程安全,通常使用non

 

十一、strong 与weak,_unsafe_unretained与weak的区别

1>strong叫强引用,weak叫弱引用,在ARC中,使用strong告诉编译器帮助咱们自动插入retain,weak是普通赋值至关于手动管理内存的assign;

2>_unsafe_unretained与weak功能一致,区别在于当指向的对象销毁后,weak会将变量置为nil,防止调用野指针。

 

1.什么状况使用 weak 关键字,相比 assign 有什么不一样?

什么状况使用 weak 关键字?

1)在ARC中,在有可能出现循环引用的时候,每每要经过让其中一端使用weak来解决,好比:delegate代理属性

2)自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用weak,自定义IBOutlet控件属性通常也使用weak;固然,也能够使用strong。

不一样点:

1)weak 此特质代表该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign相似, 然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。 而 assign 的“设置方法”只会执行针对“纯量类型” (scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操做。

2)assigin 能够用非OC对象,而weak必须用于OC对象

 

2.这个写法会出什么问题: @property (strong) NSMutableArray *array;

使用了atomic属性会严重影响性能。

该属性使用了同步锁,会在建立时生成一些额外的代码用于帮助编写多线程程序,这会带来性能问题,经过声明nonatomic能够节省这些虽然很小可是没必要要额外开销。

在默认状况下,由编译器所合成的方法会经过锁定机制确保其原子性(atomicity)。若是属性具有nonatomic特质,则不使用同步锁。请注意,尽管没有名为“atomic”的特质(若是某属性不具有nonatomic特质,那它就是“原子的”(atomic))。

在iOS开发中,你会发现,几乎全部属性都声明为nonatomic。

通常状况下并不要求属性必须是“原子的”,由于这并不能保证“线程安全” ( thread safety),若要实现“线程安全”的操做,还需采用更为深层的锁定机制才行。例如,一个线程在连续屡次读取某属性值的过程当中有别的线程在同时改写该值,那么即使将属性声明为atomic,也仍是会读到不一样的属性值。

所以,开发iOS程序时通常都会使用nonatomic属性。可是在开发Mac OS X程序时,使用 atomic属性一般都不会有性能瓶颈。

 

17.如何对iOS设备进行性能测试?

 答:Profile-> Instruments ->Time Profiler

1六、iOS开发中数据持久性,有哪几种?

plist文件写入、对象归档、sqlite3数据库、core data

 

1八、简述常见的设计模式?

单例设计、代理设计、观察者(通知)、工厂方法、模版方法

 

2四、@synthesize与dynamic的区别

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

2>@danamic的意思是告诉编译器,属性的获取与赋值方法由用户本身实现,不自动生成

 

20.Object C中建立线程的方法是什么?若是在主线程中执行代码,方法是什么?若是想延时执行代码、方法又是什么?

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

 

24.浅复制和深复制的区别?//浅拷贝和深拷贝

 

答案:

 

浅层复制(copy):只复制指向对象的指针,而不复制引用对象自己。//经过对象的指针来访问这个对象深层复制(mutableCopy):复制引用对象自己意思就是有个A对象,复制一份后获得A_copy对象后,对于浅复制来讲,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象自己资源仍是只有一份,那若是咱们对A_copy执行了修改操做,那么发现A引用的对象一样被修改,这其实违背了咱们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象自己。//当修改A时,A copy不变。

 

 

27.类别的做用?继承和类别在实现中有何区别?

 答:category 能够在不获悉,不改变原来代码的状况下往里面添加新的方法,只能添加,不能删除修改。

      而且若是类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,由于类别具备更高的优先级。类别主要有3个做用:

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

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

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

      继承能够增长,修改或者删除方法,而且能够增长属性

 

28.类别和类扩展的区别。

 答:category和extensions的不一样在于 后者能够添加属性。另外后者添加的方法是必需要实现的。extensions能够认为是一个私有的Category

 

29.KVO and KVC?

 答:kvc:键 - 值编码是一种间接访问对象的属性,使用字符串来标识属性,而不是经过调用存取方法,直接或经过实例变量访问的机制。不少状况下能够简化程序代码。apple文档其实给了一个很好的例子。kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。具体用看到用到过的一个地方是对于按钮点击变化状态的的监控。好比我自定义的一个button[cpp] 

[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil]; #pragma mark KVO  

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

      if ([keyPath isEqualToString:@"highlighted"] ) {  

          [self setNeedsDisplay];    

   } 

 }

 

对于系统是根据keypath去取的到相应的值发生改变,理论上来讲是和kvc机制的道理是同样的。对于kvc机制如何经过key寻找到value:“当经过KVC调用对象时,好比:[self valueForKey:@”someKey”]时,程序会自动试图经过几种不一样的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,若是没找到,会继续查找对象是否带有someKey这个实例变量(iVar),若是尚未找到,程序会继续试图调用

-(id) valueForUndefinedKey:这个方法。若是这个方法仍是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。(cocoachina.com注:Key-Value Coding查找方法的时候,不只仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不只仅查找someKey这个变量,也会查找_someKey这个变量是否存在。) 设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象可以在错误发生前,有最后的机会响应这个请求。这样作有不少好处,下面的两个例子说明了这样作的好处。“来至cocoa,这个说法应该挺有道理。

     由于咱们知道button倒是存在一个highlighted实例变量.所以为什么上面咱们只是add一个相关的keypath就好了,

     能够按照kvc查找的逻辑理解,就说的过去了

 

 

 

35.ARC自动引用技术

答:1.ARC是编译特性,不是运行时特性,只是在编译的时候,编译器会自动加上释放代码

    2.不能调用release、retain、autorelease、retainCount

    3.dealloc注意

     1> 不能在dealloc中调用[super dealloc]

     2> 不能在dealloc中释放资源

   4.@property参数说明

    1> retain 改成 strong

    2> 基本数据类型(int\float)仍是用assign

    3> copy 仍是 copy

    4> 若是2个对象循环引用,一端用strong,一端用weak

    5> weak是用在对象上,weak其实做用跟assign至关

  5.ARC中只容许使用经过@autoreleasepool {}建立自动释放池

 

 

36 GCD技术

答:Grand Central Dispatch简称GCD 解决多核并行运算的一种方案

看代码就行: 

//  Grand Central Dispatch简称GCD技术

    

// Do any additional setup after loading the view.

    

//    dispatch_queue_t newDispath = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

//    dispatch_async(newDispath, ^{

//        [self downloadImage];

//    }); 

//    #defineDISPATCH_QUEUE_PRIORITY_HIGH  2

//    #defineDISPATCH_QUEUE_PRIORITY_DEFAULT  0

//    #defineDISPATCH_QUEUE_PRIORITY_LOW (-2)

//    #defineDISPATCH_QUEUE_PRIORITY_BACKGROUNDINT16_MIN

 

   /*dispatch queue分为下面三种:

    * Serial:又称为private dispatch queues,同时只执行一个任务。Serial queue一般用于同步访问特定的资源或数据。当你建立多   个        Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。

    * Concurrent: 又称为global dispatch queue,能够并发地执行多个任务,可是执行完成的顺序是随机的。

    * Main dispatch queue它是全局可用的serial queue,它是在应用程序主线程上执行任务的

    */

    

   //  通常GCD 能够以下操做

    

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

        // 耗时的操做

       dispatch_async(dispatch_get_main_queue(), ^{

            // 更新界面

        });

    });

    

[selfexampleDispatch];

 

 

    /*

     *系统给每个应用程序提供了三个concurrent dispatch queues。

     *这三个并发调度队列是全局的,它们只有优先级的不一样。

     *由于是全局的,咱们不须要去建立。咱们只须要经过使用函数dispath_get_global_queue去获得队列

     */

    

   dispatch_queue_t globalQ =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); 

    

    NSLog(@"global:%p",globalQ);

    dispatch_queue_t mainQ =dispatch_get_main_queue();

     NSLog(@"mainQ:%p",mainQ);

    /*

     *虽然dispatch queue是引用计数的对象,可是以上两个都是全局的队列,不用retain或release。

     */

 

    /*

     *dispatch_group_async能够实现监听一组任务是否完成,完成后获得通知执行其余的操做。

     *这个方法颇有用,好比你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。

     */

    timeInt = 0;

    [NSTimerscheduledTimerWithTimeInterval:1

                                    target:self

                                  selector:@selector(checkingTime)

                                  userInfo:nil

                                   repeats:YES];

    [selfexampleDispath_group];

 

 /*dispatch_barrier_async的使用

     *dispatch_barrier_async是在前面的任务执行结束后它才执行,并且它后面的任务等它执行完成以后才会执行

     */

    

    [selfexampleDispatch_barrier];

    

    

   /*dispatch_apply

     *执行某个代码片断N次。

     */

    dispatch_apply(5, globalQ, ^(size_t index) {

        // 执行5次

    });

 

 

2.GCD 里面有哪几种 Queue? 背后的线程模型是什么样的?

GCD 中 Queue 的种类还要看咱们怎么进行分类, 若是根据同一时间内处理的操做数分类的话, GCD 中的 Queue 分为两类

 

Serial Dispatch Queue

Concurrent Dispatch Queue

一类是串行派发队列, 它只使用一个线程, 会等待当前执行的操做结束后才会执行下一个操做, 它按照追加的顺序进行处理. 另外一类是并行派发队列, 它同时使用多个线程, 若是当前的线程数足够, 那么就不会等待正在执行的操做, 使用多个线程同时执行多个处理.

 

另外的一种分类方式以下:

 

Main Dispatch Queue

Global Dispatch Queue

Custom Dispatch Queue

主线程只有一个, 它是一个串行的进程. 全部追加到 Main Dispatch Queue 中的处理都会在 RunLoop 在执行. Global Dispatch Queue 是全部应用程序都能使用的并行派发队列, 它有 4 个执行优先级 High, Default, Low, Background. 固然咱们也能够使用 dispatch_queue_create 建立派发队列.

 

 

14. NSOperation队列

 

操做和操做队列,基本能够当作java中的线程和线程池的概念。用于处理ios多线程开发的问题。网上部分资料提到一点是,虽然是queue,可是却并非带有队列的概念,放入的操做并不是是按照严格的先进现出。这边又有个疑点是,对于队列来讲,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的,可是Bfunc是等Afunc彻底操做完之后,B才开始启动而且执行,所以队列的概念离乱上有点违背了多线程处理这个概念。可是转念一想其实能够参考银行的取票和叫号系统。所以对于A比B先排队取票可是B率先执行完操做,咱们亦然能够感性认为这仍是一个队列。可是后来看到一票关于这操做队列话题的文章,其中有一句提到“由于两个操做提交的时间间隔很近,线程池中的线程,谁先启动是不定的。”瞬间以为这个queue名字有点忽悠人了,还不如pool~综合一点,咱们知道他能够比较大的用处在于能够帮组多线程编程就行了。

 

 

11.数组和指针的区别

(1)数组能够申请在栈区和数据区;指针能够指向任意类型的内存块

(2)sizeof做用于数组时,获得的是数组所占的内存大小;做用于指针时,获得的都是4个字节的大小

(3)数组名表示数组首地址,值不能够改变,如不能够将++做用于数组名上;普通指针的值能够改变,如可将++做用于指针上

(4)用字符串初始化字符数组是将字符串的内容拷贝到字符数组中;用字符串初始化字符指针是将字符串的首地址赋给指针,也就是指针指向了该数组

 

 

12.static的做用

(1)函数体内static 变量的做用范围为该函数体,不一样于 auto 变量,该变量的内存只被分配一次,

所以其值在下次调用时仍维持上次的值;

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

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

它的模块内;

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

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

 

13.简述内存分区状况

(1)代码区:存放函数二进制代码

(2)数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放全局变量、静态变量、常量

(3)堆区:经过malloc等函数或new等操做符动态申请获得,需程序员手动申请和释放

(4)栈区:函数模块内申请,函数结束时由系统自动释放。存放局部变量、函数参数

 

 

15.const char *p;  charconst*p;  char*const p;  const char* const p;四个修饰指针有什么区别

答: (1)定义了一个指向不可变的字符串的字符指针

(2)和(1)同样

(3)定义了一个指向字符串的指针,该指针值不可改变,即不可改变指向

(4)定义了一个指向不可变的字符串的字符指针,且该指针也不可改变指向

 

30.HTTP协议中,POST和GET的区别是什么?

答案:1.GET 方法

GET 方法提交数据不安全,数据置于请求行,客户端地址栏可见;

GET 方法提交的数据大小有限

GET 方法不能够设置书签

2.POST 方法

POST 方法提交数据安全,数据置于消息主体内,客户端不可见

POST 方法提交的数据大小没有限制

POST 方法能够设置书签

 

31.  iOS的系统架构分为( 核心操做系统层 theCore OS layer )、( 核心服务层theCore Services layer )、( 媒体层 theMedia layer )和( Cocoa 界面服务层 the Cocoa Touch layer )四个层次。

32.  控件主要响应3种事件:( 基于触摸的事件 )、( 基于值的事件 )和( 基于编辑的事件 )。

33.  xib文件的构成分为哪3个图标?都具备什么功能。(10分)

答: File’s Owner 是全部 nib 文件中的每一个图标,它表示从磁盘加载 nib 文件的对象;

First Responder 就是用户当前正在与之交互的对象;

View 显示用户界面;完成用户交互;是 UIView 类或其子类。

 

 

 

38.  UIView与CLayer有什么区别(10分)?

答: 1. UIView 是 iOS 系统中界面元素的基础,全部的界面元素都是继承自它。它自己彻底是由 CoreAnimation 来实现的。它真正的绘图部分,是由一个 CALayer 类来管理。 UIView 自己更像是一个 CALayer 的管理器,访问它的跟绘图和跟坐标有关的属性。

2. UIView 有个重要属性 layer ,能够返回它的主 CALayer 实例。

3. UIView 的 CALayer 相似 UIView 的子 View 树形结构,也能够向它的 layer 上添加子layer ,来完成某些特殊的表示。即 CALayer 层是能够嵌套的。

4. UIView 的 layer 树形在系统内部,被维护着三份 copy 。分别是逻辑树,这里是代码能够操纵的;动画树,是一个中间层,系统就在这一层上更改属性,进行各类渲染操做;显示树,其内容就是当前正被显示在屏幕上得内容。

5. 动画的运做:对 UIView 的 subLayer (非主 Layer )属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值彷佛是 0.5 秒。

6. 坐标系统: CALayer 的坐标系统比 UIView 多了一个 anchorPoint 属性,使用CGPoint 结构表示,值域是 0~1 ,是个比例值。这个点是各类图形变换的坐标原点,同时会更改 layer 的 position 的位置,它的缺省值是 {0.5,0.5} ,即在 layer 的中央。

7. 渲染:当更新层,改变不能当即显示在屏幕上。当全部的层都准备好时,能够调用setNeedsDisplay 方法来重绘显示。

8. 变换:要在一个层中添加一个 3D 或仿射变换,能够分别设置层的 transform 或affineTransform 属性。

9. 变形: Quartz Core 的渲染能力,使二维图像能够被自由操纵,就好像是三维的。图像能够在一个三维坐标系中以任意角度被旋转,缩放和倾斜。 CATransform3D 的一套方法提供了一些魔术般的变换效果。

 

41. Quatrz 2D的绘图功能的三个核心概念是什么并简述其做用(10分)。

答:上下文:主要用于描述图形写入哪里;

路径:是在图层上绘制的内容;

状态:用于保存配置变换的值、填充和轮廓, alpha 值等。

42.  iPhone OS主要提供了几种播放音频的方法(10分)?

答: SystemSound Services

AVAudioPlayer 类

Audio Queue Services

OpenAL

 

43.  使用AVAudioPlayer类调用哪一个框架、使用步骤(10分)?

答: AVFoundation.framework

步骤:配置 AVAudioPlayer 对象;

实现 AVAudioPlayer 类的委托方法;

控制 AVAudioPlayer 类的对象;

监控音量水平;

回放进度和拖拽播放。

 

46.  CFSocket使用有哪几个步骤(10分)。

答:建立 Socket 的上下文;建立 Socket ;配置要访问的服务器信息;封装服务器信息;链接服务器;

47.  Core Foundation中提供了哪几种操做Socket的方法(10分)?

答: CFNetwork 、 CFSocket 和 BSD Socket 。

 

59.   线程与进程的区别和联系?

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

 

 

60. ios 平台怎么作数据的持久化?coredata 和sqlite有无必然联系?coredata是一个关系型数据库吗?

iOS 中能够有四种持久化数据的方式:属性列表、对象归档、 SQLite3 和 Core Data; core data 能够使你以图形界面的方式快速的定义 app 的数据模型,同时在你的代码中容易获取到它。 coredata 提供了基础结构去处理经常使用的功能,例如保存,恢复,撤销和重作,容许你在 app 中继续建立新的任务。在使用 core data 的时候,你不用安装额外的数据库系统,由于 core data 使用内置的 sqlite 数据库。 core data 将你 app 的模型层放入到一组定义在内存中的数据对象。 coredata 会追踪这些对象的改变,同时能够根据须要作相反的改变,例如用户执行撤销命令。当 core data 在对你 app 数据的改变进行保存的时候, core data 会把这些数据归档,并永久性保存。 mac os x 中sqlite 库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。能够在多个平台使用, sqlite 是一个轻量级的嵌入式 sql 数据库编程。与 core data 框架不一样的是, sqlite 是使用程序式的, sql 的主要的 API 来直接操做数据表。 Core Data 不是一个关系型数据库,也不是关系型数据库管理系统 (RDBMS) 。虽然 Core Dta 支持SQLite 做为一种存储类型,但它不能使用任意的 SQLite 数据库。 Core Data 在使用的过程种本身建立这个数据库。 Core Data 支持对1、对多的关系。

 

 

进程的同步机制,并比较其优缺点

(a)信号量机制: PV操做可以实现对临界区的管理要求;实现简单;容许使用它的代码休眠,持有锁的时间可相对较长。一个信号量只能置一次初值,之后只能对之进行p操做或v操做。由此也能够看到,信号量机制必须有公共内存,不能用于分布式操做系统,这是它最大的弱点。信号量机制功能强大,但使用时对信号量的操做分散, 并且难以控制,读写和维护都很困难。加剧了程序员的编码负担;核心操做P-V分散在各用户程序的代码中,不易控制和管理;一旦错误,后果严重,且不易发现和纠正。

 

(b)自旋锁: 旋锁是为了保护共享资源提出的一种锁机制。调用者申请的资源若是被占用,即自旋锁被已经被别的执行单元保持,则调用者一直循环在那里看是否该自旋锁的保持着已经释放了锁。自旋锁是一种比较低级的保护数据结构和代码片断的原始方式,可能会引发如下两个问题; 一、死锁 二、过多地占用CPU资源 传统自旋锁因为无序竞争会致使“公平性”问题 

 

(c)管程: 信号量机制功能强大,但使用时对信号量的操做分散,并且难以控制,读写和维护都很困难。所以后来又提出了一种集中式同步进程——管程。其基本思想是将共享变量和对它们的操做集中在一个模块中,操做系统或并发程序就由这样的模块构成。这样模块之间联系清晰,便于维护和修改,易于保证正确性。 

 

(d)会合: 进程直接进行相互做用 

 

(e)分布式系统: 因为在分布式操做系统中没有公共内存,所以参数全为值参,并且不可为指针。 

 

(f)原语 是不可中断的过程。加锁/开锁(LOCK/UNLOCK)原语优势是实现互斥简单;缺点是效率很低

 

 

2.进程间通讯的方式有______

    (1)管道(Pipe):管道可用于具备亲缘关系进程间的通讯,容许一个进程和另外一个与它有共同祖先的进程之间进行通讯。

  (2)命名管道(named pipe):命名管道克服了管道没有名字的限制,所以,除具备管道所具备的功能外,它还容许无亲缘关系进程间的通讯。命名管道在文件系统中有对应的文件名。命名管道经过命令mkfifo或系统调用mkfifo来建立。

  (3)信号(Signal):信号是比较复杂的通讯方式,用于通知接受进程有某种事件发生,除了用于进程间通讯外,进程还能够发送信号给进程自己;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又可以统一对外接口,用sigaction函数从新实现了signal函数)。

  (4)消息(Message)队列:消息队列是消息的连接表,包括Posix消息队列system V消息队列。有足够权限的进程能够向队列中添加消息,被赋予读权限的进程则能够读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺

  (5)共享内存:使得多个进程能够访问同一块内存空间,是最快的可用IPC形式。是针对其余通讯机制运行效率较低而设计的。每每与其它通讯机制,如信号量结合使用,来达到进程间的同步及互斥。

  (6)内存映射(mapped memory):内存映射容许任何多个进程间通讯,每个使用该机制的进程经过把一个共享的文件映射到本身的进程地址空间来实现它。

(7)信号量(semaphore):主要做为进程间以及同一进程不一样线程之间的同步手段。

(8)套接口(Socket):更为通常的进程间通讯机制,可用于不一样机器之间的进程间通讯。起初是由Unix系统的BSD分支开发出来的,但如今通常能够移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

 

23.http和scoket通讯的区别。

http是客户端用http协议进行请求,发送请求时候须要封装http请求头,并绑定请求的数据,服务器通常有web服务器配合(固然也非绝 对)。 http请求方式为客户端主动发起请求,服务器才能给响应,一次请求完毕后则断开链接,以节省资源。服务器不能主动给客户端响应(除非采起http长链接 技术)。iphone主要使用类是NSUrlConnection。

scoket是客户端跟服务器直接使用socket“套接字”进行链接,并无规定链接后断开,因此客户端和服务器能够保持链接通道,双方 均可以主动发送数据。通常在游戏开发或股票开发这种要求即时性很强而且保持发送数据量比较大的场合使用。主要使用类是CFSocketRef。

TCP全称是Transmission Control Protocol,中文名为传输控制协议,它能够提供可靠的、面向链接的网络数据传递服务。传输控制协议主要包含下列任务和功能:

* 确保IP数据报的成功传递。

* 对程序发送的大块数据进行分段和重组。

* 确保正确排序及按顺序传递分段的数据。

* 经过计算校验和,进行传输数据的完整性检查。

 

五、TCP/IP 创建链接的过程

 

在TCP/IP 协议中,TCP协议提供可靠的链接服务,采用三次握手创建链接;

第一次握手:创建链接时,客户端发送链接请求到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到客户端链接请求,向客户端发送容许链接应答,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的容许链接应答,向服务器发送确认,客户端和服务器进入通讯状态,完成三次握手。

(所谓的三次握手,就是要有三次链接信息的发送、接收过程。TCP连的创建须要进行三次链接信息的发送、接收。)

 

三、TCP/UDP区别联系

1>、TCP的全称为传输控制协议 这种协议能够提供面向链接的、可靠的、点到点的通讯

2>、UDP的全称为用户数据报协议,它能够提供非链接的不可靠的点到多点的通讯

3>、用TCP仍是UDP,那要看你的程序注重南一方面? 可靠仍是快速?

8.Objective-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对象加入到最内层的系统内存池, 当咱们释放这个内存池时, 其中的对象都会被释放.

 

十、内存不足,系统会发出警告,此时控制器应该如何处理

内存不足时,系统会调用控制器的didReceiveMemoryWarning方法通知控制器内存不足。iOS6.0与6.0以前的处理方式不同。

1>、6.0以前,调用didReceiveMemoryWarning后,将self.view设置为nil,而且再调用viewDidUnload方法,在此方法中咱们应该释放子视图!

2>、6.0以后,调用didReceiveMemoryWarning后,再也不调用viewDidUnload方法,则应该在didReceiveMemoryWarning方法中手动将self.view=nil,而且释放子视图!

40id、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,而不是对象)。

 

 

 

1.AFNetworking或SDWebImage 里面给 UIImageView 加载图片的逻辑是什么样的?

SDWebImage 中为 UIView 提供了一个分类叫作 WebCache, 这个分类中有一个最经常使用的接口, sd_setImageWithURL:placeholderImage: , 这个分类同时提供了不少相似的方法, 这些方法最终会调用一个同时具备 option progressBlock completionBlock 的方法, 而在这个类最终被调用的方法首先会检查是否传入了 placeholderImage 以及对应的参数, 并设置 placeholderImage .

而后会获取 SDWebImageManager 中的单例调用一个 downloadImageWithURL:... 的方法来获取图片, 而这个 manager 获取图片的过程有大致上分为两部分, 它首先会在 SDWebImageCache 中寻找图片是否有对应的缓存, 它会以 url 做为数据的索引先在内存中寻找是否有对应的缓存, 若是缓存未命中就会在磁盘中利用 MD5 处理过的 key 来继续查询对应的数据, 若是找到了, 就会把磁盘中的缓存备份到内存中.

然而, 假设咱们在内存和磁盘缓存中都没有命中, 那么 manager 就会调用它持有的一个 SDWebImageDownloader 对象的方法 downloadImageWithURL:... 来下载图片, 这个方法会在执行的过程当中调用另外一个方法 addProgressCallback:andCompletedBlock:fotURL:createCallback: 来存储下载过程当中和下载完成的回调, 当回调块是第一次添加的时候, 方法会实例化一个 NSMutableURLRequest 和 SDWebImageDownloaderOperation , 并将后者加入 downloader 持有的下载队列开始图片的异步下载.

而在图片下载完成以后, 就会在主线程设置 image, 完成整个图像的异步下载和配置.

 

4.什么是iOS中的沙盒机制。

IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用建立的文件夹内读取文件,不能够访问其余地方的内容。

1.每一个应用程序都在本身的沙盒内

2.不能随意跨越本身的沙盒去访问别的应用程序沙盒的内容

3.应用程序向外请求或接收数据都须要通过权限认证

默认状况下,每一个沙盒含有3个文件夹:Documents, Library 和 tmp。由于应用的沙盒机制,应用只能在几个目录下读写文件

Documents:苹果建议将程序中创建的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录

Library:存储程序的默认设置或其它状态信息;

Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除

tmp:提供一个即时建立临时文件的地方

 

4.nil, Nil, NSNULL, NULL区别

nil是指向obj-c中对象的空指针,是一个对象,在o-c中ni对象调用方法不会引发crash。

Nil是指向obj-c中的类的空指针,表示的是一个空类。

NULL是指向任何类型的空指针(如c/c++中的空指针),在objective-c中是一个数值。

 

NSNULL用于集合操做,在集合对象中,表示一个空值的集合对象。

5.iOS中处理音频和视频使用哪些框架?

AVFoundation(基于Core Audio、Core Video、Core Media等框架)、MediaPlayer、UIKit

 

1.如何监听View的触摸事件,事件是如何传递的、视图的响应者链是什么?

(1)覆写View类的touchBegin、touchMove、touchEnd系列方法监听视图的触摸。

(2)事件传递:当触摸一个视图时,首先系统会捕捉此事件,并为此事件建立一个UIEvent对 象,将此对象加入当前应用程序的事件队列中,而后由UIApplication对象从队列中,一个一个取出来进⾏分发,⾸首先分发给UIWindow对象,而后由UIWindow对象分发给触摸的视图对 象,也就是第一响应者对象。!

(3)响应者链: 事件被交由第一响应者对象处理,若是第一响应者不处理,事件被沿着响应 者链向上传递,交给下一个响应者(next responder)。通常来讲,第一响应者是个视图对 象或者其子类对象,当其被触摸后事件被交由它处理,若是它不处理,事件就会被传递给它 的视图控制器对象(若是存在),而后是它的父视图(superview)对象(若是存在),以 此类推,直到顶层视图。接下来会沿着顶层视图(top view)到窗⼝口(UIWindow对象)再 到程序(UIApplication对象)。若是整个过程都没有响应这个事件,该事件就被丢弃。通常 状况下,在响应者链中只要由对象处理事件,事件就停⽌传递。但有时候能够在视图的响应 ⽅方法中根据一些条件判断来决定是否须要继续传递事件。

 

 

2五、响应者链的概念

响应者链表示一系列的响应者对象。事件被交由第一响应者对象处理,若是第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者(next responder)。通常来讲,第一响应者是个视图对象或者其子类对象,当其被触摸后事件被交由它处理,若是它不处理,事件就会被传递给它的视图控制器对象(若是存在),而后是它的父视图(superview)对象(若是存在),以此类推,直到顶层视图。接下来会沿着顶层视图(top view)到窗口(UIWindow对象)再到程序(UIApplication对象)。若是整个过程都没有响应这个事件,该事件就被丢弃。通常状况下,在响应者链中只要由对象处理事件,事件就中止传递。但有时候能够在视图的响应方法中根据一些条件判断来决定是否须要继续传递事件。

三、c语言中extern的做用,extern c的做用?

1>extern能够置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其余模块中寻找其定义

2>c++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而c语言则不会,所以会形成连接时找不到对应函数的状况,此时c函数就须要extern“C”进行连接指定,这告诉编译器,请保持个人名称,不要给我生成用于连接的中间函数名

 

2.xml数据的解析方式,各有什么不一样?

(1)xml数据解析有两种解析⽅方式:DOM解析与SAX解析!

(2)DOM解析必须先完成DOM树的构造,在处理规模较大的XML文档时就很耗内存,占⽤资 源较多! 

(3)与DOM不一样的是,它是⽤用事件驱动模型,解析XMl⽂文档时每遇到一个开始或者结束标 签、 或者属性、或者一条指令时,程序就产⽣生一个事件来进⾏行相应的处理,所以,SAX相对于 DOM来讲更适合操做⼤的XML文档!

 

1.Core Graphics 和Quartz 2D的区别?

quartz是一个通用的术语,用于描述在IOS和MAC OS X ZHONG 整个媒体层用到的多种技术 包括图形、动画、音频、适配。

Quart 2D 是一组二位绘图和渲染API,Core Graphic会使用到这组API 

Quartz Core 专指Core Animation用到的动画相关的库、API和类。

 

 

3九、Cocoa Touch框架

UIKit、Foundation、CoreGraphic、QuartzCore

1>音频和视频

          Core Audio

          OPenAL

          Media Library

           AV  Foundation

2>数据管理

           Core Data

           SQLite

 3>图形和动画

         Core Animation

         OpenGL ES

         Quartz 2D

 4>用户应用

         Address Book

         Core Location

          Map Kit

          Store Kit

 

4七、单例设计模式的实现,为何使用单例设计

static File * instance  = nil;

@implementation File

//获取单例的方法

+(id)shareInstance

{

   @synchronized(self)

      {

if(instance == nil)

        { 

   instance = [[File alloc]init];

        }

      }

  return instance;

}

覆写allocWithZone、copyWithZone、retain、authorelease 方法,目的是限制这个类只建立一个对象

 

 

 

 

1九、用过哪些开源网络框架各有什么特色

1>、ASIHTTPRequest

优势:出来比较早、功能强大、文档丰富(目前不少应用还在使用)

缺点:已经中止更新、新特性少、厚重且对iOS5以上支持不够完善。

2>、AFNetWorking

优势:支持比较新的特性、简单易用

缺点:文档数目通常、功能少、忽略拉一些扩展功能(如:没有同步请求)

3>、MKNetWorking

优势:支持arc、一个印度大卡写的。有ASIHTTPRequest的功能,AFNetWorking的轻便

缺点:文档数目最少(几乎没有)

 

2八、ASI网络框架有哪些功能?

1>、ASI是款极其强劲的HTTP访问开源框架;

2>、功能:异步请求  队列请求  gzip压缩  缓存  断点续传  进度跟踪  上传文件  HTTP认证

 

20、iOS中有哪些数据持久化的方式,各有什么特色,ios平台怎么作数据的持久化?CoreData 和sqlite有无必然的联系?CoreData是一个关系型数据库吗?

1>、主要有四种持久化方式:属性列表、对象归档、SQLLite、coredata。

2>、CoreData不是一个数据库,不过能够使用SQLLite数据库来保持数据,也能够使用其余的方式存储数据,如XML。

3>、属性列表、对象归档适合小数据量存储和查询操做。

4>、SQLite、CoreData适合大数据存储和查询操做。

 

2一、iPhone5如何适配

1>、添加启动图片,Default-568h@2x.png 分辨率640*1136 pixels

2>、在编码时,尽可能不要写死480*320的尺寸,使用UIScreen获取硬件的物理尺寸

3>、经过设置autosizing 来适应在父视图中的frame

 

2二、iOS中如何捕捉异常

@try{}

@catch{}

 

2三、用过单元测试吗

iOS自带了一个测试框架OCUnit,但目前最好用的测试框架应该是GHUnit

 

2五、苹果APP的上架流程、什么状况下会被打回

1>、访问私有API

2>、APP有严重deBUG

3>、给苹果审核的测试帐号没法登录,或者境外没法访问国内服务器

4>、APP描述中带“Beta”字样,或是其余代表APP还未开发完成的信息

5>、APP加载时间过长,iOS APP的最长启动时间不得超过15秒

6>、给出外部购买连接

7>、APP描述中提到了iOS以外的其余支持平台

 

 

 

2六、tableView是如何复用的?

若是屏幕上能显示10个单元格,则tableView只会建立11个单元格,也就是n+1,当滑到第12个单元格时就会复用第1个单元格对象。tableView中有个单元格池这么一个概念,tableView调用协议方法获取单元格时,先从池子中查找是否有可复用的单元格,若是有则复用,没有则建立一个单元格对象

 

2七、如何优化tableView的滑动速度

1>、复用单元格;

2>、使用不透明的视图,单元格中尽可能少使用动画;

3>、图片加载使用异步加载,而且设置图片加载的并发数;

4>、滑动时不加载图片,中止滑动开始加载;

5>、文字,图片能够直接drawInRect绘制;

6>、如非必要,减小reloadData所有的cell,只reloadRowsAtIndexPaths;

7>、若是Cell是动态行高,计算出高度后缓存;

8>、Cell高度固定的话直接cell.rowHeight设置高度

 

 

3一、如何将产品进行多语言发布,作国际化开发

1>、新建String File文件,命名为 Localizable.strings, 往里面添加你想要的语言支持

2>、在不一样语言的 Localizable.strings文件中添加对应的文本

3>、XIB文件国际化

4>、程序名称国际化

参考:http://hi.baidu.com/yunhuaikong/item/d8e8e2e4be13a8088c3ea829

 

 

3七、iOS中都有哪些手势

iOS提供了不少手势对象用于识别不一样的手势操做,手势:轻击,捏合,平移,轻扫,旋转,长按

 

40、二维码扫描用过哪些类库,这些类库有什么特色?

二维码生成:QRGener

二维码扫描:zxing,ZBarSDK

二维码扫描:推荐使用zxing,由于zxing能够自定义扫描区域,并且是开源的,可是这个库集成起来比较复杂

 

4四、StoryBoard用过吗,有什么特色?

1>、StoryBoard是iOS5新增的特性,是对xib的升级版本,引入了一个容器用于管理多个xib文件,和他们之间的跳转交互

2>、有点:不用在为每一个控制器建立xib文件了

3>、缺点: StoryBoard单个文件,不利于团队协做开发

 

4五、如何打包静态库?

新建一个Framework&Library的项目,编译的时候,会将项目中的代码文件打包成一个.a的静态库文件

 

4六、App发布的上架流程?

1>、在苹果网站的开发者中心,新建一个App,填写此APP相关的一些描述信息

2>、下载安装发布证书

3>、选择发布证书,是与Archive生成发布包

4>、使用xcode提交发布包

 

  1. 什么是序列化或者Archiving?能够用来做甚么?怎么和copy结合?原理是什么?

答:序列化是将对象状态转换为可保持或传输的格式的过程,在序列化过程当中,对象的公共字段和私有字段以及类的名称(包括包含该类的程序集)都被转换为字节流,而后写入数据流。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,能够轻松地存储和传输数据。(在iphone中要实现对象序列化,首相被序列化的对象必须NSCodeing 协议和NSCopying 协议,并分别实现两个协议的方法:NSCoding- (void)encodeWithCoder:(NSCoder *)encoder; - (id)initWithCoder:(NSCoder *)decoder #NSCoding:- (id)copyWithZone:(NSZone *)zone  ) 

为什要对象序列化?a. 一个缘由是将对象的状态保持在存储媒体中,以即可以在之后从新建立精确的副本。
咱们常常须要将对象的字段值保存到磁盘中,并在之后检索此数据。尽管不使用序列化也能完成这项工做,但这种方法一般很繁琐并且容易出错,而且在须要跟踪 对象的层次结构时,会变得愈来愈复杂。能够想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每个对象编写代码,以便将字段和属性保存 至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。
b.另外一个缘由是经过值将对象从一个应用程序域发送到另外一个应用程序域中。
例如,序列化可用于在 ASP.NET 中保存会话状态并将对象复制到 Windows 窗体的剪贴板中。远程处理还能够使用序列化经过值将对象从一个应用程序域传递到另外一个应用程序域中。 

 

 

  1. 线程是什么?有哪些注意事项?

答:线程是一组指令集合,或者是程序的特殊段,它能够在程序里独立执行,也可把它理解为代码运行的上下文,线程是在同一时间须要完成多项任务的时候被实现的。

,进程和线程都是由操做系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性.简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 

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

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

注意多线程数据共享管理的问题和死锁问题(形成死锁的4个必备条件:互斥、请求保持、不可剥夺、环路),怎样解决死锁问题? 答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁

Iphone代码上怎么解决死锁问题?建立操做队列NSOperationQueue(至关于java中的线程池)用操做队列来管理多个任务对象(继承自NSOperation),每一个任务对象去各自完成本身的行为。。。。

  1. Runloop是什么?在主线程里的某一个函数里调用了一个异步函数,怎么样block当前线程,并且还能响应当前线程的timer事件,touch事件等。

答:每一个线程内部都有本身的Run loop(这里不是指特定类,就是一个循环)。 线程常见的状况以下 while(stopThread_bool){ } 就是这个循环。 既然obj-c有runtime能力,因此apple就开发了 NSRunLoop 类,来管理线程内的循环,能够在程序运行时添加,删除和修改loop内的代码 。固然同时NSRunLoop有MainThread循环的管理功能,这样你能够给MainThread runloop里面插入你本身但愿执行的代码(通常状况是界面更新有关的函数)。亦或给本身定义的thread加入一个NSRunLoop对象,动态管理线程执行的代码。 这样一个线程内的代码可能会 while(stopThread_bool){      //custom code      NSArray *funArray=[[self runloopObj] loopFunArray];      foreach(fun in funArray){          [self performSeletor:@selector(fun)];      } } 以上是一个假想的Thread和它的NSRunLoop实例交互的伪代码。 1.首先你要看到你认识上的问题,在书里介绍的runloop != while or for语句 2.每一个线程都有本身的NSRunLoop,他们是本身创建的 3.并非因此线程都须要使用它的NSRunLoop. 若是线程的runloop没有本身的input source,它不会运行。 4.如下几个状况是须要用线程的runloop        Use ports or custom input sources to communicate with other threads.        Use timers on the thread.        Use any of the performSelector… methods in a Cocoa application.        Keep the thread around to perform periodic tasks. 5. - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait 这样的语句实际上就是在向Main Thread的runloop对象添加input source. 我不知道怎么解释你才能更清楚,也许你能够再多说说你不理解的地方。 另外一个说法:runloop一个UI事件,Timer call, delegate call,都会是一个新的runloop。