美文网首页
iOS 面试题汇总(三)

iOS 面试题汇总(三)

作者: 清蘂翅膀的技术 | 来源:发表于2017-06-18 21:17 被阅读0次

    27. 说说响应链

    答: 事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。

    可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。因为问的太抽象化了

    严重怀疑题目出到越后面就越笼统。

    可以从责任链模式,来讲通过事件响应链处理,其拥有的扩展性

    28. frame和bounds有什么不同?

    答:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)

    bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)

    29. 方法和选择器有何不同?

    答:selector是一个方法的名字,method是一个组合体,包含了名字和实现.

    详情可以看apple文档。

    30. OC的垃圾回收机制?

    答: OC2.0有Garbage collection,但是iOS平台不提供。

    一般我们了解的objective-c对于内存管理都是手动操作的,但是也有自动释放池。

    但是差了大部分资料,貌似不要和arc机制搞混就好了。

    31. NSOperation queue?

    答:存放NSOperation的集合类。

    操作和操作队列,基本可以看成java中的线程和线程池的概念。用于处理ios多线程开发的问题。

    网上部分资料提到一点是,虽然是queue,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。

    这边又有个疑点是,对于队列来说,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的,

    但是Bfunc是等Afunc完全操作完以后,B才开始启动并且执行,因此队列的概念离乱上有点违背了多线程处理这个概念。

    但是转念一想其实可以参考银行的取票和叫号系统。

    因此对于A比B先排队取票但是B率先执行完操作,我们亦然可以感性认为这还是一个队列。

    但是后来看到一票关于这操作队列话题的文章,其中有一句提到

    “因为两个操作提交的时间间隔很近,线程池中的线程,谁先启动是不定的。”

    瞬间觉得这个queue名字有点忽悠人了,还不如pool~

    综合一点,我们知道他可以比较大的用处在于可以帮组多线程编程就好了。

    32. 什么是延迟加载?

    答:懒汉模式,只在用到的时候才去初始化。

    也可以理解成延时加载。

    我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。

    一个延时载,避免内存过高,一个异步加载,避免线程堵塞。

    33. 是否在一个视图控制器中嵌入两个tableview控制器?

    答:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,

    只能说可以嵌入一个tableview视图。当然,题目本身也有歧义,如果不是我们定性思维认为的UIViewController,而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController那样的感觉。

    34. 一个tableView是否可以关联两个不同的数据源?你会怎么处理?

    答:首先我们从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。

    因此我们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据自己的需要去设置如相关的数据源。

    因此,我觉得可以设置多个数据源啊,但是有个问题是,你这是想干嘛呢?想让列表如何显示,不同的数据源分区块显示?

    35. 什么时候使用NSMutableArray,什么时候使用NSArray?

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

    36. 给出委托方法的实例,并且说出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;

    37. 在应用中可以创建多少autorelease对象,是否有限制?

    答案:无

    38. 如果我们不创建内存池,是否有内存池提供给我们?

    答:界面线程维护着自己的内存池,用户自己创建的数据线程,则需要创建该线程的内存池

    39. 什么时候需要在程序中创建内存池?

    答:用户自己创建的数据线程,则需要创建该线程的内存池

    40. 类NSObject的那些方法经常被使用?

    答:NSObject是Objetive-C的基类,其由NSObject类及一系列协议构成。

    其中类方法alloc、class、 description 对象方法init、dealloc、– performSelector:withObject:afterDelay:等经常被使用

    41. 什么是简便构造方法?

    答:简便构造方法一般由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt:

    Foundation下大部分类均有简便构造方法,我们可以通过简便构造方法,获得系统给我们创建好的对象,并且不需要手动释放。

    42. 如何使用Xcode设计通用应用?

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

    43. UIView的动画效果有那些?

    答:有很多,如 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDown

    44. 在iPhone应用中如何保存数据?

    答:有以下几种保存机制:

    1).通过web服务,保存在服务器上

    2).通过NSCoder固化机制,将对象保存在文件中

    3).通过SQlite或CoreData保存在文件数据库中

    45. 什么是coredata?

    答:coredata是苹果提供一套数据保存框架,其基于SQlite

    46. 什么是NSManagedObject模型?

    答:NSManagedObject是NSObject的子类 ,也是coredata的重要组成部分,它是一个通用的类,实现了core data 模型层所需的基本功能,用户可通过子类化NSManagedObject,建立自己的数据模型。

    47. 什么是NSManagedobjectContext?

    答:NSManagedobjectContext对象负责应用和数据库之间的交互。

    48. 什么是谓词?

    答:谓词是通过NSPredicate,是通过给定的逻辑条件作为约束条件,完成对数据的筛选。

    1

    2predicate?=?[NSPredicate?predicateWithFormat:@"customerID?==?%d",n];

    a?=?[customers?filteredArrayUsingPredicate:predicate];

    49. 和coredata一起有哪几种持久化存储机制?

    答:存入到文件、 存入到NSUserDefaults(系统plist文件中)、存入到Sqlite文件数据库

    50. 谈谈对Block 的理解?并写出一个使用Block执行UIVew动画?

    答:Block是可以获取其他函数局部变量的匿名函数,其不但方便开发,并且可以大幅提高应用的执行效率(多核心CPU可直接处理Block指令)

    1

    2

    3

    4

    5[UIView?transitionWithView:self.view

    duration:0.2

    options:UIViewAnimationOptionTransitionFlipFromLeft

    animations:^{?[[blueViewController?view]?removeFromSuperview];?[[self?view]?insertSubview:yellowViewController.view?atIndex:0];?}

    completion:NULL];

    51. 写出上面代码的Block的定义。

    答:

    1

    2typedef?void(^animations)?(void);

    typedef?void(^completion)?(BOOL?finished);

    52. 试着使用+ beginAnimations:context:以及上述Block的定义,写出一个可以完成

    1

    +?(void)transitionWithView:(UIView?*)view?duration:(NSTimeInterval)duration?options:(UIViewAnimationOptions)options?animations:(void?(^)(void))animations?completion:(void?(^)(BOOL?finished))completion?NS_AVAILABLE_IOS(4_0);

    操作的函数执行部分

    答案:无

    53. 做过的项目是否涉及网络访问功能,使用什么对象完成网络功能?

    答:ASIHTTPRequest与NSURLConnection

    54. 简单介绍下NSURLConnection类及+ sendSynchronousRequest:returningResponse:error:与– initWithRequest:delegate:两个方法的区别?

    答: NSURLConnection主要用于网络访问,其中+ sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前线程会阻塞,并等待request的返回的response,而– initWithRequest:delegate:使用的是异步加载,当其完成网络访问后,会通过delegate回到主线程,并其委托的对象。

    55. 多线程是什么

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

    56. 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和异步函数等都有使用多线程,(待补充).

    57. 在项目什么时候选择使用GCD,什么时候选择NSOperation?

    答: 项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。

    项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。

    58. 什么是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。

    59. block 实现原理

    答: Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。

    从计算语言的发展,最早的goto,高级语言的指针,到面向对象语言的block,从机器的思维,一步步接近人的思维,以方便开发人员更为高效、直接的描述出现实的逻辑(需求)。

    使用实例

    cocoaTouch框架下动画效果的Block的调用

    使用typed声明block

    1

    2typedef?void(^didFinishBlock)?(NSObject?*ob);

    这就声明了一个didFinishBlock类型的block,

    然后便可用

    1

    @property?(nonatomic,copy)?didFinishBlock?finishBlock;

    声明一个blokc对象,注意对象属性设置为copy,接到block 参数时,便会自动复制一份。

    __block是一种特殊类型,

    使用该关键字声明的局部变量,可以被block所改变,并且其在原函数中的值会被改变。

    60.关于block

    答: 面试时,面试官会先问一些,是否了解block,是否使用过block,这些问题相当于开场白,往往是下面一系列问题的开始,所以一定要如实根据自己的情况回答。

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

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

    iOS设计模式—-委托模式

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

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

    2). 多线程与block

    GCD与Block

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

    GCD编程实例

    dispatch_async的完整定义

    1

    2

    3void?dispatch_async(

    dispatch_queue_t?queue,

    dispatch_block_t?block);

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

    通过queue来控制block执行的线程。主线程执行前文定义的 finishBlock对象

    1

    dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();});

    62.谈谈Object-C的内存管理方式及过程?

    答: 1).当你使用new,alloc和copy方法创建一个对象时,该对象的保留计数器值为1.当你不再使用该对象时,你要负责向该对象发送一条release或autorelease消息.这样,该对象将在使用寿命结束时被销毁.

    2).当你通过任何其他方法获得一个对象时,则假设该对象的保留计数器值为1,而且已经被设置为自动释放,你不需要执行任何操作来确保该对象被清理.如果你打算在一段时间内拥有该对象,则需要保留它并确保在操作完成时释放它.

    3).如果你保留了某个对象,你需要(最终)释放或自动释放该对象.必须保持retain方法和release方法的使用次数相等.

    相关文章

      网友评论

          本文标题:iOS 面试题汇总(三)

          本文链接:https://www.haomeiwen.com/subject/jwjwqxtx.html