iOS面试题-第十三页

作者: 像羽毛那样轻 | 来源:发表于2016-03-30 10:37 被阅读62次

    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,是通过给定的逻辑条件作为约束条件,完成对数据的筛选。

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

    a = [customers filteredArrayUsingPredicate:predicate];

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

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

    50. 谈谈对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];

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

    答:

    1

    2

    typedef void(^animations) (void);

    typedef void(^completion) (BOOL finished);

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

    + (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

    typedef 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的完整定义

    void dispatch_async(

    dispatch_queue_t queue,

    dispatch_block_t block);

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

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

    1

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

    相关文章

      网友评论

        本文标题:iOS面试题-第十三页

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