IOS面试题汇总1.docx
《IOS面试题汇总1.docx》由会员分享,可在线阅读,更多相关《IOS面试题汇总1.docx(24页珍藏版)》请在冰豆网上搜索。
IOS面试题汇总1
1.iOS结构
iOS架构从低向上分别是核心操作系统层、核心服务层、媒体层、可触摸层。
2.什么是Cocoa?
什么是Cocoatouch?
Cocoa包含Foundation和AppKit框架,可用于开发MacOSX系统的应用程序。
CocoaTouch包含Foundation和UIKit框架,可用于开发iPhoneOS系统的应用程序。
3.Differencebetweenshallowcopyanddeepcopy?
浅复制和深复制的区别?
浅层复制:
只复制指向对象的指针,而不复制引用对象本身。
深层复制:
复制引用对象本身。
首先我们要搞清楚copy和mutalbeCopy的区别。
其中前者是不可变的类,后者是可变的类。
copy和mutableCopy的区别在于它们的返回值是不可变类型还是可变类型。
不管被复制的对象是不可变的还是可变的,copy的返回值类型始终是不可变类型。
例如:
NSString*str1=@"hello";
NSString*str2=[str1copy];//指针copy
NSString*str3=[str1mutableCopy];//深copy
NSMutableString*mutableStr2=[str1copy];//指针copy
NSMutableString*mutableStr3=[str1mutableCopy];//深copy
[mutableStr3appendString:
@"-oc"];
NSLog(@"str1=%@\nstr2=%@\nstr3=%@\nmutablStr2=%@\nmutableStr3=%@\n\n\n\n\n",str1,str2,str3,mutableStr2,mutableStr3);
//输出str1,str2,str3;
NSLog(@"str1=%p\nstr2=%p\nstr3=%p\nmutablStr2=%p\nmutableStr3=%p",str1,str2,str3,mutableStr2,mutableStr3);
//输出str1,str2,str3的地址。
结果:
2013-11-1818:
47:
03.752Copy[23556:
303]
str1=hello
str2=hello
str3=hello
mutablStr2=hello
mutableStr3=hello-oc
2013-11-1818:
47:
03.755Copy[23556:
303]
str1=0x100001050
str2=0x100001050
str3=0x10010c090
mutablStr2=0x100001050
mutableStr3=0x10010c0d0
4.Whatisadvantageofcategories?
Whatisdifferencebetweenimplementingacategoryandinheritance?
类别的作用?
继承和类别在实现中有何区别?
答案:
类别就是类的附加方法的声明,它不能附加实例变量。
但是继承实际上重新创建了一个新的类。
#import
@interfaceMyClass:
NSObject
-(void)myPrint;
@end
#import"MyClass.h"
@implementationMyClass
-(void)myPrint
{
NSLog(@"myPrint调用了");
}
@end
继承可以增加,修改或者删除方法,并且可以增加属性,子类可以从父类继承方法.
下面创个weapon的子类tank;
#import"Tank.h"
@implementationTank
-(void)move{
NSLog(@"Thetankismoving!
");//直接引用父类weapon的方法move
}
-(void)attack{
NSLog(@"Thetankisattacking!
");//直接引用父类weapon的方法attack
}
@end
5.Differencebetweencategoriesandextensions?
类别和类扩展的区别。
答案:
category和extensions的不同在于后者可以添加属性。
另外后者添加的方法是必须要实现的。
extensions可以认为是一个私有的Category
类别(Category)是一种可以为现有的类添加新方法的方式无需从现有的类继承子类。
类别添加的新方法可以被子类继承。
类扩展Classextensions
类扩展声明格式@interfaceMyClass(),可以在类扩展中声明属性和实例变量
例如
@interfaceMyClass:
NSObject
...................
@end
@interfaceMyClass()//类扩展
{
float_value;
}
@property(assign,readonly)value;
@end
6.Differencebetweenprotocolinobjectivecandinterfacesinjava?
oc中的协议和java中的接口概念有何不同?
答案:
OBC中的代理有2层含义,官方定义为formal和informalprotocol。
前者和Java接口一样。
informalprotocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。
其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里
“非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。
这个意思是,这些是可选的。
比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。
然后你在后期可以直接使用这些更好的方法。
这么看,总觉得类别这玩意儿有点像协议的可选协议。
"
现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,
现在我们看到协议中两个修饰词:
“必须实现(@requied)”和“可选实现(@optional)”。
7.WhatareKVOandKVC?
答案:
kvc:
键-值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。
很多情况下可以简化程序代码。
apple文档其实给了一个很好的例子。
kvo:
键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。
具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。
比如我自定义的一个button
[cpp]
[selfaddObserver:
selfforKeyPath:
@"highlighted"options:
0context:
nil];
#pragmamarkKVO
-(void)observeValueForKeyPath:
(NSString*)keyPathofObject:
(id)objectchange:
(NSDictionary*)changecontext:
(void*)context
{
if([keyPathisEqualToString:
@"highlighted"]){
[selfsetNeedsDisplay];
}
}
对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。
对于kvc机制如何通过key寻找到value:
“当通过KVC调用对象时,比如:
[selfvalueForKey:
@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。
首先查找对象是否带有someKey这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用-(id)valueForUndefinedKey:
这个方法。
如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。
(注:
Key-ValueCoding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。
同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。
)
设计valueForUndefinedKey:
方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。
这样做有很多好处,下面的两个例子说明了这样做的好处。
“
来至cocoa,这个说法应该挺有道理。
因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了,
可以按照kvc查找的逻辑理解,就说的过去了。
8.Whatispurposeofdelegates?
代理的作用?
答案:
代理的目的是改变或传递控制链。
允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。
可以减少框架复杂度。
另外一点,代理可以理解为java中的回调监听机制的一种类似。
9.WhataremutableandimmutabletypesinObjectiveC?
obc中可修改和不可以修改类型。
答案:
可修改不可修改的集合类。
这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。
比如NSArray和NSMutableArray。
前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。
10.Whenwecallobjectivecisruntimelanguagewhatdoesitmean?
我们说的obc是动态运行时语言是什么意思?
答案:
多态。
主要是将数据类型的确定由编译时,推迟到了运行时。
这个问题其实浅涉及到两个概念,运行时和多态。
简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
多态:
不同对象以自己的方式响应相同的消息的能力叫做多态。
意思就是假设生物类(life)都用有一个相同的方法-eat;
那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。
因此也可以说,运行时机制是多态的基础?
~~~
11.whatisdifferencebetweenNSNotificationandprotocol?
通知和协议的不同之处?
答案:
协议有控制链(has-a)的关系,通知没有。
首先我一开始也不太明白,什么叫控制链(专业术语了~)。
但是简单分析下通知和代理的行为模式,我们大致可以有自己的理解
简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。
代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济代理人,很多时候一个经济人负责好几个明星的事务。
只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别称B的
发布会了。
但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。
因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关系。
10.Whatispushnotification?
什么是推送消息?
11.Polymorphism?
关于多态性
答案:
多态,子类指针可以赋值给父类。
这个题目其实可以出到一切面向对象语言中,
因此关于多态,继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来。
最重要的是转化成自我理解。
12.Singleton?
对于单例的理解
答案:
11,12题目其实出的有点泛泛的感觉了,可能说是编程语言需要或是必备的基础。
基本能用熟悉的语言写出一个单例,以及可以运用到的场景或是你编程中碰到过运用的此种模式的框架类等。
进一步点,考虑下如何在多线程访问单例时的安全性。
13.Whatisresponderchain?
说说响应链
答案:
事件响应链。
包括点击事件,画面刷新事件等。
在视图栈内从上至下,或者从下之上传播。
可以说点事件的分发,传递以及处理。
具体可以去看下touch事件这块。
因为问的太抽象化了
严重怀疑题目出到越后面就越笼统。
14.Differencebetweenframeandbounds?
frame和bounds有什么不同?
答案:
frame指的是:
该view在父view坐标系统中的位置和大小。
(参照点是父亲的坐标系统)
bounds指的是:
该view在本身坐标系统中的位置和大小。
(参照点是本身坐标系统)
15.Differencebetweenmethodandselector?
方法和选择器有何不同?
答案:
selector是一个方法的名字,method是一个组合体,包含了名字和实现.
详情可以看apple文档。
16.IsthereanygarbagecollectionmechanisminObjectiveC.?
OBC的垃圾回收机制?
答案:
OBC2.0有Garbagecollection,但是iOS平台不提供。
一般我们了解的objective-c对于内存管理都是手动操作的,但是也有自动释放池。
但是差了大部分资料,貌似不要和arc机制搞混就好了。
求更多~~
17.NSOperationqueue?
答案:
存放NSOperation的集合类。
操作和操作队列,基本可以看成java中的线程和线程池的概念。
用于处理ios多线程开发的问题。
网上部分资料提到一点是,虽然是queue,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。
这边又有个疑点是,对于队列来说,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的,
但是Bfunc是等Afunc完全操作完以后,B才开始启动并且执行,因此队列的概念离乱上有点违背了多线程处理这个概念。
但是转念一想其实可以参考银行的取票和叫号系统。
因此对于A比B先排队取票但是B率先执行完操作,我们亦然可以感性认为这还是一个队列。
但是后来看到一票关于这操作队列话题的文章,其中有一句提到
“因为两个操作提交的时间间隔很近,线程池中的线程,谁先启动是不定的。
”
瞬间觉得这个queue名字有点忽悠人了,还不如pool~
综合一点,我们知道他可以比较大的用处在于可以帮组多线程编程就好了。
18.Whatislazyloading?
答案:
懒汉模式,只在用到的时候才去初始化。
也可以理解成延时加载。
我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。
一个延时载,避免内存过高,一个异步加载,避免线程堵塞。
19.Canweusetwotableviewcontrollersononeviewcontroller?
是否在一个视图控制器中嵌入两个tableview控制器?
答案:
一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧,
只能说可以嵌入一个tableview视图。
当然,题目本身也有歧义,如果不是我们定性思维认为的UIViewController,
而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController
那样的感觉。
20.Canweuseonetableviewwithtwodifferentdatasources?
Howyouwillachievethis?
一个tableView是否可以关联两个不同的数据源?
你会怎么处理?
答案:
首先我们从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。
因此我们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据自己的需要去设置如相关的数据源。
因此,我觉得可以设置多个数据源啊,但是有个问题是,你这是想干嘛呢?
想让列表如何显示,不同的数据源分区块显示?
21.Object-c的类可以多重继承么?
可以实现多个接口么?
重写一个类的方式用继承好还是分类好?
为什么?
Objective-c只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,cocoa中所有的类都是NSObject的子类,多继承在这里是用protocol委托代理来实现的。
22.#import跟#include又什么区别#import<>跟#import""又什么区别?
答案:
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import而#import比起#include的好处就是不会引起交叉编译。
23.类变量的@protected,@private,@public,@package声明各有什么含义?
24.id声明的对象有什么特性?
答案:
id是个很重要的类型,是个可以指向任何类型的指针或者可以理解为指向任何未知类型的指针。
25.MVC是什么?
有什么特性?
为什么在iPhone上被广泛运用?
答案:
MVC设计模式考虑三种对象:
模型对象、视图对象、和控制器对象。
模型对象代表特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。
视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。
控制器对象是应用程序的视图对象和模型对象之间的协调者。
26.对于语句NSString*testObject=[[NSDataalloc]init];testObject在编译时和运行时分别是什么类型的对象?
27.什么是安全释放?
28.为什么有些4.0独有的objective-c函数在3.1上运行时会报错.而4.0独有的类在3.1上分配内存时不会报错?
分配的结果是什么?
29.为什么4.0独有的c函数在3.1的机器上运行不会报错(在没有调用的情况下?
)而4.0独有的类名在3.1的机器上一运行就报错?
30.异常exception怎么捕获?
不同的CPU结构上开销怎样?
C中又什么类似的方法?
31.property中属性retain,copy,assgin的含义分别是什么?
有什么区别?
将其转换成get/set方法怎么做?
有什么注意事项?
32.委托是什么?
委托的property声明用什么属性?
为什么?
34.Cocoa中有虚基类的概念么?
怎么简洁的实现?
35.自动释放池跟GC(垃圾回收)有什么区别?
iPhone上有GC么?
[poolrelease]和[pooldrain]有什么区别?
iPhone上没有GC。
iPhone开发的时候没有垃圾回收机制。
在垃圾回收环境中,release是一个空操作。
因此,NSAutoreleasePool提供了drain方法,在引用计数环境中,该方法的作用等同于调用release,但在垃圾回收环境中,它会触发垃圾回收(如果自上次垃圾回收以来分配的内存大于当前的阈值)。
因此,在通常情况下,您应该使用drain而不是release来销毁自动释放池。
36.
for(intindex=0;index<20;index++){
NSString*tempStr=@”tempStr”;
NSLog(tempStr);
NSNumber*tempNumber=[NSNumbernumberWithInt:
2];
NSLog(tempNumber);
}
这段代码有什么问题.?
会不会造成内存泄露(多线程)?
在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外好?
为什么?
37.内存管理的几条原则时什么?
按照默认法则.那些关键字生成的对象需要手动释放?
在和property结合的时候怎样有效的避免内存泄露?
38.在一个对象释放前.如果他被加到了notificationCenter中.不在notificationcenter中remove这个对象可能会出现什么问题?
39.怎样实现一个singleton的类.给出思路。
40.什么是序列化或者Acrchiving,可以用来做什么,怎样与copy结合,原理是什么?
.
41.线程与进程的区别和联系?
答案:
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。
程和线程的主要差别在于它们是不同的操作系统资源管理方式。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
42.在iphone上有两件事情要做,请问是在一个线程里按顺序做效率高还是两个线程里做效率高?
为什么?
43.runloop是什么?
在主线程中的某个函数里调用了异步函数,怎么样block当前线程,且还能响应当前线程的timer事件,touch事件等.
44.ios平台怎么做数据的持久化?
coredata和sqlite有无必然联系?
coredata是一个关系型数据库吗?
iOS中可以有四种持久化数据的方式:
属性列表、对象归档、SQLite3和CoreData;coredata可以使你以图形界面的方式快速的定义app的数据模型,同时在你的代码中容易获取到它。
coredata提供了基础结构去处理常用的功能,例如保存,恢复,撤销和重做,允许你在app中继续创建新的任务。
在使用coredata的时候,你不用安装额外的数据库系统,因为coredata使用内置的sqlite数据库。
coredata将你app的模型层放入到一组定义在内存中的数据对象。
coredata会追踪这些对象的改变,同时可以根据需要做相反的改变,例如用户执行撤销命令。
当coredata在对你app数据的改变进行保存的时候,coredata会把这些数据归档,并永久性保存。
macosx中sqlite库,它是一个轻量级功能强大的关系数据引擎,也很容易嵌入到应用程序。
可以在多个平台使用,sqlite是一个轻量级的嵌入式sql数据库编程。
与coredata框架不同的是,sqlite是使用程序式的,sql的主要的API来直接操作数据表。