http://blog.csdn.net/xunyn/article/details/8302787 iOS面试题系列: 随着iOS平台开发的职位的增加,笔试、面试也越来越有“套路”,这里我总结了一些面试题,多数是Objective-C的基础知识,适合于面试新人,答案是我自己答的,不准确的地方,欢迎指出。 1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。
2.#import 跟#include 又什么区别,@class呢, #import<> 跟 #import”"又什么区别? #import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import””用来包含用户头文件。
3. 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用? readwrite 是可读可写特性;需要生成getter方法和setter方法时 readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变 assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时; retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1; copy 表示拷贝特性,setter方法将传入对象复制一份;需要完全一份新的变量时。 nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic 4.写一个setter方法用于完成@property (nonatomic,retain)NSString *name,写一个setter方法用于完成@property(nonatomic,copy)NSString *name
5.对于语句NSString*obj = [[NSData alloc] init]; obj在编译时和运行时分别时什么类型的对象? 编译时是NSString的类型;运行时是NSData类型的对象 6.常见的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。 7.id 声明的对象有什么特性? Id 声明的对象具有运行时的特性,即可以指向任意类型的objcetive-c的对象;
8.Objective-C如何对内存管理的,说说你的看法和解决方法? Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池。
9.内存管理的几条原则时什么?按照默认法则.那些关键字生成的对象 需要手动释放?在和property结合的时候怎样有效的避免内存泄露? 谁申请,谁释放 遵循Cocoa Touch的使用原则; 内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。 关键字alloc 或new 生成的对象需要手动释放; 设置正确的property属性,对于retain需要在合适的地方释放,
10.如何对iOS设备进行性能测试? Profile-> Instruments ->Time Profiler 11.看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢? 为什么?
str的retainCount创建+1,retain+1,加入数组自动+1 3 retain+1,release-1,release-1 2 数组删除所有对象,所有数组内的对象自动-1 1 12. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么? 线程创建有三种方法:使用NSThread创建、使用GCD的dispatch、使用子类化的NSOperation,然后将其加入NSOperationQueue;在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone: 13.描述一下iOS SDK中如何实现MVC的开发模式 MVC是模型、试图、控制开发模式,对于iOS SDK,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据。 =============== iOS进阶面试题----多线程部分 1.Difference between shallow copy and deep copy? 2.What is advantage of categories? What is difference between implementing a category and inheritance? 3.Difference between categories and extensions? 4.Difference between protocol in objective c and interfaces in java? OC中的协议(formal protocol)与java中的接口概念基本一致,OC中非正式协议(informal protocol)就是类别。在java中如果继承了接口,但不实现其方法,会得到一个error(无法编译);在OC中的正式协议,如果不实现,会得到一个warning(可编译执行),如果想去除waring,还可以加关键字(@optional),让它可选实现方法。 5.What are KVO and KVC? 对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。 6.What is purpose of delegates? 7.What are mutable and immutable types in Objective C? 8.When we call objective c is runtime language what does it mean? 9.what is difference between NSNotification and protocol? 10.What is push notification? 11.Polymorphism? 12.Singleton? 13.What is responder chain? 可以从责任链模式,来讲通过事件响应链处理,其拥有的扩展性 14.Difference between frame and bounds? 15.Difference between method and selector? 16.Is there any garbage collection mechanism in Objective C.? 17.NSOperation queue? 楼上区分了线程执行时的次序(Afunc和Bfunc谁先启动)和线程执行完成(Afunc和Bfunc谁先执行完)时的次序不同,而多线程的重要概念是并发(同时执行多个任务),NSOperationQueue是管理并发线程的对象,可以在其中放入NSOpertation对象(对象化的线程实体),通过设置maxConcurrentOperationCount的大小,控制并发数目,如楼上所说希望“Afunc添加进队列,执行完后,Bfunc紧跟进入队列,继续执行”,那只需将maxConcurrentOperationCount设为1,变会依次执行,这时候实际是在单线程依次执行。所以这里的NSOperationQueue就是对象化抽象的去管理多线程,这样的好处,使用者通过继承NSOperation对象,可以方便的用对象来管理线程,而不再用关心线程同步、信号量等细节,更多地关注于业务逻辑。 18.What is lazy loading? 19.Can we use two tableview controllers on one viewcontroller? 20.Can we use one tableview with two different datasources? How you will achieve this? =============================== 1.When to use NSMutableArray and when to use NSArray? 什么时候使用NSMutableArray,什么时候使用NSArray? 答案:当数组在程序运行时,需要不断变化的,使用NSMutableArray,当数组在初始化后,便不再改变的,使用NSArray。需要指出的是,使用NSArray只表明的是该数组在运行时不发生改变,即不能往NSAarry的数组里新增和删除元素,但不表明其数组內的元素的内容不能发生改变。NSArray是线程安全的,NSMutableArray不是线程安全的,多线程使用到NSMutableArray需要注意。 2.Give us example of what are delegate methods and what are data source methods of uitableview. 给出委托方法的实例,并且说出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; 3.How many autorelease you can create in your application? Is there any limit? 在应用中可以创建多少autorelease对象,是否有限制? 答案:无 4.If we don’t create any autorelease pool in our application then is there any autorelease pool already provided to us? 如果我们不创建内存池,是否有内存池提供给我们? 答案:界面线程维护着自己的内存池,用户自己创建的数据线程,则需要创建该线程的内存池 5.When you will create an autorelease pool in your application? 什么时候需要在程序中创建内存池? 答案:用户自己创建的数据线程,则需要创建该线程的内存池 6.When retain count increase? 什么时候内存计数会增加? 答案:见iOS面试题(一) 7.What are commonly used NSObject class methods? 类NSObject的那些方法经常被使用? 答案:NSObject是Objetive-C的基类,其由NSObject类及一系列协议构成。 其中类方法alloc、class、 description 对象方法init、dealloc、– performSelector:withObject:afterDelay:等经常被使用 8.What is convenience constructor? 什么是简便构造方法? 答案:简便构造方法一般由CocoaTouch框架提供,如NSNumber的 + numberWithBool: + numberWithChar: + numberWithDouble: + numberWithFloat: + numberWithInt: Foundation下大部分类均有简便构造方法,我们可以通过简便构造方法,获得系统给我们创建好的对象,并且不需要手动释放。 9.How to design universal application in Xcode? 如何使用Xcode设计通用应用? 答案:使用MVC模式设计应用,其中Model层完成脱离界面,即在Model层,其是可运行在任何设备上,在controller层,根据iPhone与iPad(独有UISplitViewController)的不同特点选择不同的viewController对象。在View层,可根据现实要求,来设计,其中以xib文件设计时,其设置其为universal。 10.What is keyword atomic in Objective C? 在Objetive-C什么时原子关键字 答案:atomic,nonatomic见iOS面试题(一) 11.What are UIView animations? UIView的动画效果有那些? 答案:有很多,如 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUpUIViewAnimationOptionTransitionCurlDown 12.How can you store data in iPhone applications? 在iPhone应用中如何保存数据? 答案:有以下几种保存机制: 1.通过web服务,保存在服务器上 2.通过NSCoder固化机制,将对象保存在文件中 3.通过SQlite或CoreData保存在文件数据库中 13.What is coredata? 什么是coredata? 答案:coredata框架是apple提供的一套通用自动的解决方案,包括了对象生存周期、对象关系图、持久化机制。 补充答案:上面是翻译的,按我个人理解coredata提供一种一机制,让我们可以方便的把内存中对象,及对象间的关系,映射到coredata,然后由它为我们持久化数据。相比普通的文件数据库SQlite,它的功能更强大,不需要我们先将对象数据format成SQL语句,存入数据库,再用select语句读出,而现在是从内存到coredata的数据管理,我们只需管理coredata的managed对象。 是苹果提供一套数据保存 14.What is NSManagedObject model? 什么是NSManagedObject模型? 答案:NSManagedObject是NSObject的子类 ,也是coredata的重要组成部分,它是一个通用的类,实现了core data 模型层所需的基本功能,用户可通过子类化NSManagedObject,建立自己的数据模型。 15.What is NSManagedobjectContext? 什么是NSManagedobjectContext? 答案:NSManagedobjectContext对象负责应用和数据库之间的交互。 16.What is predicate? 什么是谓词? 答案:谓词是通过NSPredicate,是通过给定的逻辑条件作为约束条件,完成对数据的筛选。 predicate = [NSPredicate predicateWithFormat:@"customerID == %d",n]; a = [customers filteredArrayUsingPredicate:predicate]; 17.What kind of persistence store we can use with coredata? coredata有哪几种持久化存储机制? 答案:coredatat提供以下几种存储机制:XML(iOS系统不支持),自动存储,SQLite,内存存储。 补充说明:这个问题问的是,coredate框架的存储机制,平时使用coredata时,更多关注的是managed的对象,这里是coerdata框架的存储实现细节。BTW: 其他常用的持久化存储方法 :存入到文件、 存入到NSUserDefaults(系统plist文件中)。 =================== 1 谈谈对Block 的理解?并写出一个使用Block执行UIVew动画? 答案:Block是可以获取其他函数局部变量的匿名函数,其不但方便开发,并且可以大幅提高应用的执行效率(多核心CPU可直接处理Block指令)
2 写出上面代码的Block的定义。 答案: typedef void(^animations) (void); typedef void(^completion) (BOOL finished); 3 试着使用+ 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);操作的函数执行部分 答案:无 网络部分 3 做过的项目是否涉及网络访问功能,使用什么对象完成网络功能? 答案:ASIHTTPRequest与NSURLConnection 4 简单介绍下NSURLConnection类及+ sendSynchronousRequest:returningResponse:error:与– initWithRequest:delegate:两个方法的区别? 答案: NSURLConnection主要用于网络访问,其中+ sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前线程会阻塞,并等待request的返回的response,而– initWithRequest:delegate:使用的是异步加载,当其完成网络访问后,会通过delegate回到主线程,并其委托的对象。 多线程部分 ============ 1 什么是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。 2 block 实现原理 Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。 从计算语言的发展,最早的goto,高级语言的指针,到面向对象语言的block,从机器的思维,一步步接近人的思维,以方便开发人员更为高效、直接的描述出现实的逻辑(需求)。 下面是两篇很好的介绍block实现的博文 3 block的使用 使用实例 使用typed声明block typedef void(^didFinishBlock) (NSObject *ob); 这就声明了一个didFinishBlock类型的block, 然后便可用 @property (nonatomic,copy) didFinishBlock finishBlock; 声明一个block对象,注意对象属性设置为copy,接到block 参数时,便会自动复制一份。 __block是一种特殊类型, 使用该关键字声明的局部变量,可以被block所改变,并且其在原函数中的值会被改变。 4 常见系列面试题 面试时,面试官会先问一些,是否了解block,是否使用过block,这些问题相当于开场白,往往是下面一系列问题的开始,所以一定要如实根据自己的情况回答。 1 使用block和使用delegate完成委托模式有什么优点? 首先要了解什么是委托模式,委托模式在iOS中大量应用,其在设计模式中是适配器模式中的对象适配器,Objective-C中使用id类型指向一切对象,使委托模式更为简洁。了解委托模式的细节: 使用block实现委托模式,其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑; 适配对象不再需要实现具体某个protocol,代码更为简洁。 2 多线程与block GCD与Block 使用 dispatch_async 系列方法,可以以指定的方式执行block 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();}); =============== 1 什么是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。 2 block 实现原理 Objective-C是对C语言的扩展,block的实现是基于指针和函数指针。 从计算语言的发展,最早的goto,高级语言的指针,到面向对象语言的block,从机器的思维,一步步接近人的思维,以方便开发人员更为高效、直接的描述出现实的逻辑(需求)。 下面是两篇很好的介绍block实现的博文 3 block的使用 使用实例 使用typed声明block typedef void(^didFinishBlock) (NSObject *ob); 这就声明了一个didFinishBlock类型的block, 然后便可用 @property (nonatomic,copy) didFinishBlock finishBlock; 声明一个block对象,注意对象属性设置为copy,接到block 参数时,便会自动复制一份。 __block是一种特殊类型, 使用该关键字声明的局部变量,可以被block所改变,并且其在原函数中的值会被改变。 4 常见系列面试题 面试时,面试官会先问一些,是否了解block,是否使用过block,这些问题相当于开场白,往往是下面一系列问题的开始,所以一定要如实根据自己的情况回答。 1 使用block和使用delegate完成委托模式有什么优点? 首先要了解什么是委托模式,委托模式在iOS中大量应用,其在设计模式中是适配器模式中的对象适配器,Objective-C中使用id类型指向一切对象,使委托模式更为简洁。了解委托模式的细节: 使用block实现委托模式,其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑; 适配对象不再需要实现具体某个protocol,代码更为简洁。 2 多线程与block GCD与Block 使用 dispatch_async 系列方法,可以以指定的方式执行block 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();}); |
|