iOS面试题集锦附答案个人精心整理.docx

上传人:b****6 文档编号:7152619 上传时间:2023-01-21 格式:DOCX 页数:21 大小:281.92KB
下载 相关 举报
iOS面试题集锦附答案个人精心整理.docx_第1页
第1页 / 共21页
iOS面试题集锦附答案个人精心整理.docx_第2页
第2页 / 共21页
iOS面试题集锦附答案个人精心整理.docx_第3页
第3页 / 共21页
iOS面试题集锦附答案个人精心整理.docx_第4页
第4页 / 共21页
iOS面试题集锦附答案个人精心整理.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

iOS面试题集锦附答案个人精心整理.docx

《iOS面试题集锦附答案个人精心整理.docx》由会员分享,可在线阅读,更多相关《iOS面试题集锦附答案个人精心整理.docx(21页珍藏版)》请在冰豆网上搜索。

iOS面试题集锦附答案个人精心整理.docx

iOS面试题集锦附答案个人精心整理

1、第三方库、masonry第三方自动布局是否用过,类方法和对象方法的区别

2、MVC机制

C对M:

API

C对V:

Outlet

V对C:

Target-action,Delegate,Datasource

M对C:

Notification,KVO

3、runtime机制

runtime是一套比较底层的纯C语言API,属于1个C语言库,包含了很多底层的C语言API。

runtime用来干什么呢?

用在那些地方呢?

怎么用呢?

runtime是属于OC的底层,可以进行一些非常底层的操作(用OC是无法现实的,不好实现)

在程序运行过程中,动态创建一个类(比如KVO的底层实现)

在程序运行过程中,动态地为某个类添加属性\方法,修改属性值\方法

遍历一个类的所有成员变量(属性)\所有方法

例如:

我们需要对一个类的属性进行归档解档的时候属性特别的多,这时候,我们就会写很多对应的代码,但是如果使用了runtime就可以动态设置!

1>头文件利用头文件,我们可以查看到runtime中的各个方法!

2>相关应用

NSCoding(归档和解档,利用runtime遍历模型对象的所有属性)

字典–>模型(利用runtime遍历模型对象的所有属性,根据属性名从字典中取出对应的值,设置到模型的属性上)

KVO(利用runtime动态产生一个类)

用于封装框架(想怎么改就怎么改)

这就是我们runtime机制的只要运用方向

3>相关函数

objc_msgSend:

给对象发送消息

class_copyMethodList:

遍历某个类所有的方法

class_copyIvarList:

遍历某个类所有的成员变量

class_…..

这是我们学习runtime必须知道的函数!

4.必备常识

1>Ivar:

成员变量

2>Method:

成员方法

从上面例子中我们看到我们定义的成员变量,如果要是动态创建方法,可以使用Method,

4、strong,weak,assign有什么区别

assign:

简单赋值,不更改索引计数(ReferenceCounting)。

copy:

建立一个索引计数为1的对象,然后释放旧对象

retain:

释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

weak和strong的区别:

(weak和strong)不同的是当一个对象不再有strong类型的指针指向它的时候它会被释放,即使还有weak型指针指向它。

一旦最后一个strong型指针离去,这个对象将被释放,所有剩余的weak型指针都将被清除。

可能有个例子形容是妥当的。

想象我们的对象是一条狗,狗想要跑掉(被释放)。

strong型指针就像是栓住的狗。

只要你用牵绳挂住狗,狗就不会跑掉。

如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落,否着狗是不会跑掉的。

weak型指针就像是一个小孩指着狗喊到:

“看!

一只狗在那”只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。

只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。

只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。

使用assign:

对基础数据类型(NSInteger,CGFloat)和C数据类型(int,float,double,char,等等)

使用copy:

对NSString

使用retain:

对其他NSObject和其子类

nonatomic关键字:

atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。

而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

assign用于简单数据类型,如NSInteger,double,bool,retain和copy用户对象,copy用于当a指向一个对象,b也想指向同样的对象的时候,如果用assign,a如果释放,再调用b会crash,如果用copy的方式,a和b各自有自己的内存,就可以解决这个问题。

retain会使计数器加一,也可以解决assign的问题。

另外:

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。

在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。

5、uiview和uiwindow的区别

6、property属性

@property是一个属性访问声明,扩号内支持以下几个属性:

@synthesizexxx;为这个心属性自动生成读写函数;

7、OC和C++的区别

两者最大的不同便是:

ObjectiveC提供了运行期动态绑定机制,而C++是编译时静态绑定,并通过嵌入类(多重继承)和虚函数(虚表)来模拟实现.ObjectiveC在语言层次上支持动态消息转发,其函数调用语法为[objectfunction],而且C++为object->function().两者的语义也有不同,

在ObjectiveC里是说发送消息到一个对象上,至于这个对象能不能处理消息(也就是说实现了这个函数与否)以及是处理还是转发消息都不会crash,而在C++里是说对象进行了某个操作,如果对象没有这个操作的话,要么编译会报错(静态绑定),要么程序会crash掉的(动态绑定).

1.继承:

Objective-C与同Java和Smalltalk一样不支持多重继承,而C++语言支持多重继承(从侧面可以说明多重继承的效率不高);

2.函数调用:

Objective-C通过互相传递消息实现函数调用,而C++直接进行函数调用

3.定型:

Objective-C是动态定型(dynamicalytyped)。

所以它的类库比C++要容易操作。

Objective-C在运行时可以允许根据字符串名字来访问方法和类,还可以动态连接和添加类。

而C++,对象的静态类型决定你是否可以发送消息给它。

4.接口:

Objective-C采用protocol协议(非正式和正式)的形式来定义接口,而C++采用虚函数的形式来定义接口。

5.方法重载:

c++中允许两个方法的名字相同,参数个数相同,但是参数类型不同,以及不同的返回值类型。

而OC中不允许同一个类中两个方法有相同的名字,参数个数相同,参数类型不同。

8、监听

优势:

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

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

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

缺点:

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

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

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

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

5.controller和观察者需要提前知道通知名称、UserInfodictionarykeys。

如果这些没有在工作区间定义,那么会出现不同步的情况;

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

1、.注册通知:

addObserver:

selector:

name:

object,并实现触发通知后要实现的操作

[[NSNotificationCenterdefaultCenter]addObserver:

selfselector:

@selector(reloadJpushData:

)name:

@"JPUSHNOTIFICATION"object:

nil];

-(void)reloadJpushData:

(NSNotification*)sender{

[selfgetData];

}

2、发送通知:

postNotificationName:

object(就在触发通知的方法里写)

[[NSNotificationCenterdefaultCenter]postNotificationName:

@"JPUSHNOTIFICATION"object:

nil];

3、移除通知:

removeObserver:

和removeObserver:

name:

object:

其中,removeObserver:

是删除通知中心保存的调度表一个观察者的所有入口,而removeObserver:

name:

object:

是删除匹配了通知中心保存的调度表中观察者的一个入口。

我以前发现不移除通知也不会报错,但是想想不用的东西进行移除,然后用的时候到再进行注册,这是一种良好的编程方式,有始有终,不要给程序留下潜在的问题。

在dealloc方法下实现

这个比较简单,直接调用该方法就行。

例如:

移除单个通知:

[[NSNotificationCenterdefaultCenter]removeObserver:

selfname:

@"JPUSHNOTIFICATION"object:

self];

移除当前所有通知:

[[NSNotificationCenterdefaultCenter]removeObserver:

self];

9、block要在内部改变外界变量如何改变。

__block

10、通知创建多个不销毁会发生什么

会出现脏内存,出现crash

11、断点续传怎么实现

1、http实现断点续传的关键地方就是在httprequest中加入“Range”头。

//设置Range头,值:

bytes=x-y;x:

开始字节,y:

结束字节,不指定则为文件末尾

[requestaddValue:

@"bytes=500-"forHTTPHeaderField:

@"Range"];

如果服务器正确响应的话,就可以顺利续传;如果服务器不支持,就只能用其它方法了。

2、Range头域

Range头域可以请求实体的一个或者多个子范围。

例如,

表示头500个字节:

bytes=0-499

表示第二个500字节:

bytes=500-999

表示最后500个字节:

bytes=-500

表示500字节以后的范围:

bytes=500-

第一个和最后一个字节:

bytes=0-0,-1

同时指定几个范围:

bytes=500-600,601-999

但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。

注意:

如果用户的请求中含有range,则服务器的相应代码为206。

206-PartialContent客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP1.1新)。

12、手动布局之后如何改变布局

13、MJRefresh的实现原理

14、数据库缓存是怎么做的

进入展示页面下拉刷新上拉加载更多

15、数据库添加字段属性,版本更新该怎么做还有跨版本更新该怎么做

16、自动布局假如把视图隐藏了,是否自动布局还生效

用masonry时是生效的

17、遇到什么问题一般怎么解决的,去哪些网站查

Code4appcocoachina简书github

18、自动布局是在什么时候可以修改,viewDidLoad可以吗,不是,那是在哪里修改

不行,viewDidload执行时还没有执行自动布局

Viewwillappearviewwilllayoutappearviewdidlayoutappear

19、KVO需不需要销毁

观察者销毁之前,移除观察者,否则会出现程序异常(给已经销毁的对象发送消息)

基础题:

1、在oc中如何实现深度拷贝

copymutableCopy

2.请描述什么是delegate、block、NSNotification,他们有什么作用

iOS页面间传值的方式

3.请写出一个线程安全的单例模式

+ (AccountManager *)sharedManager  

{ static AccountManager *sharedAccountManagerInstance = nil;  

        static dispatch_once_t predicate;  

        dispatch_once(&predicate, ^{  

                sharedAccountManagerInstance = [[self alloc] init];   

        });  

    return sharedAccountManagerInstance;  

}  

4.解释属性中strong、weak、assign、copy的区别

5.#import和#include的区别

#import指令是Object-C针对#include的改进版本,#import确保引用的文件只会被引用一次,这样你就不会陷入递归包含的问题中。

6.描述tableView的重用机制

7.Object-C有多继承吗?

没有的话用什么代替?

没有,ObjectiveC不能直接使用多重继承。

cocoa中所有的类都是NSObject的子类,多重继承在这里是用protocol委托代理来实现的。

一个类可以实现多个接口。

8.category与继承之间的区别

Protocol只能定义一套接口,而不能提供实现,变相的也是一种Abstractclass的实现方式(oc语法上本身不支持抽象基类)。

Category可以为类提供额外的接口和实现。

那么到底三者(继承,Protocol,Category)在使用上到底有什么本质的区别呢?

在我看来,protocol的作用是为一些列类仅仅提供一套公用的接口,而完全没有办法也没可能去提供具体的一些实现情况;category则是为一个已有的类提供一些额外的接口和具体实现;而继承则基于两者之间,既可以想protocol一样提供只是纯粹提供接口,也可以像Category一样提供完整的实现,而且继承还能对类以后的功能进行改写,所以说继承的力量是最强大的。

category和extensions的不同在于后者可以添加属性。

另外后者添加的方法是必须要实现的。

9.#define和const定义的变量,有什么区别

1.define是宏定义,程序在预处理阶段将用define定义的内容进行了替换。

因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。

const定义的常量,在程序运行时在常量表中,系统为它分配内存。

(1)编译器处理方式不同

  define宏是在预处理阶段展开。

  const常量是编译运行阶段使用。

(2)类型和安全检查不同

  define宏没有类型,不做任何类型检查,仅仅是展开。

  const常量有具体的类型,在编译阶段会执行类型检查。

(3)存储方式不同

  define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。

  const常量会在内存中分配(可以是堆中也可以是栈中)。

(4)const可以节省空间,避免不必要的内存分配。

例如:

#definePI3.14159//常量宏

constdoulbePi=3.14159;//此时并未将Pi放入ROM中......

doublei=Pi;//此时为Pi分配内存,以后不再分配!

doubleI=PI;//编译期间进行宏替换,分配内存

doublej=Pi;//没有内存分配

doubleJ=PI;//再进行宏替换,又一次分配内存!

const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而#define定义的常量在内存中有若干个拷贝。

(5)提高了效率。

编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

10.TCP和UDP的区别是什么?

11.MD5和Base64的区别是什么,各自场景是什么?

md5用户密码存储文件校验

base64公开的代码加密url加密

MD5将任意长度的"字节串"变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,base64解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据。

12.二叉搜索树的概念,时间复杂度多少?

13.如何添加一个自定义字体到工程中

14.如何制作一个静态库/动态库,他们的区别是什么?

15.Configuration中,debug和release的区别是什么?

16.pushviewcontroller和presentviewcontroller的区别

就是使用self.navigationControlerpushViewController和popViewController来进行视图切换的,pushViewController是进入到下一个视图,popViewController是返回到上一视图。

没有NavigationController导航栏的话,使用self.presentViewController和self.dismissModalViewController。

具体是使用可以从文档中详细了解。

17.描述下tableviewcell的重用机制

18.UIView的frame和bounds的区别是什么

19.new与allocinit的区别

区别只在于alloc分配内存的时候使用了zone.如果使用new的话,初始化方法被固定死只能调用init.而你想调用initXXX怎么办?

没门儿!

据说最初的设计是完全借鉴Smalltalk语法来的。

20.NSArray实例化时,array与init的区别

这两个方式都是建立一个空的Array

[NSArrayarray]不需要release,使用autoreleasepool机制。

[[NSArrayalloc]init]需要自己手动release

中级题目

什么是arc?

(arc是为了解决什么问题诞生的?

请解释以下keywords的区别:

assignvsweak,blockvsweak

__block在arc和非arc下含义一样吗?

在ARC下,由于__block抓取的变量一样会被Blockretain,所以必须用弱引用才可以解决循环引用问题;在非ARC下,显然无法使用弱引用,这里就可以直接使用__block来修饰变量,它不会被Block所retain的。

使用atomic一定是线程安全的吗?

不一定

描述一个你遇到过的retaincycle例子。

+(void)load;+(void)initialize;有什么用处?

load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。

所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。

它们的相同点在于:

方法只会被调用一次。

同样的+(void)initialize优先于+(void)load先执行。

但是很明显的不同在于,只有最后一个类别(Category)的+(void)initialize执行,其他两个都被隐藏。

而对于+(void)load,三个都执行,并且如果Apple的文档中介绍顺序一样:

先执行类自身的实现,再执行类别(Category)中的实现。

为什么其他语言里叫函数调用,objectivec里则是给对象发消息

在Objective-C中,发送消息最终会被转化为函数调用,避免动态绑定的唯一办法就是取得方法的地址,并且直接象函数调用一样调用它。

当一个方法会被连续调用很多次,而且您希望节省每次调用方法都要发送消息的开销时,使用方法地址来调用方法就显得很有效。

什么是methodswizzling?

+(void)load{

[superload];

//通过class_getInstanceMethod()函数从当前对象中的methodlist获取method结构体,如果是类方法就使用class_getClassMethod()函数获取。

MethodfromMethod=class_getInstanceMethod([selfclass],@selector(viewDidLoad));

MethodtoMethod=class_getInstanceMethod([selfclass],@selector(swizzlingViewDidLoad));

/**

*我们在这里使用class_addMethod()函数对MethodSwizzling做了一层验证,如果self没有实现被交换的方法,会导致失败。

*而且self没有交换的方法实现,但是父类有这个方法,这样就会调用父类的方法,结果就不是我们想要的结果了。

*所以我们在这里通过class_addMethod()的验证,如果self实现了这个方法,class_addMethod()函数将会返回NO,我们就可以对其进行交换了。

*/

if(!

class_addMethod([selfclass],@selector(viewDidLoad),method_getImplementation(toMethod),method_getTypeEncoding(toMethod))){

method_exchangeImplementations(fromMethod,toMethod);

}

}

//我们自己实现的方法,也就是和self的viewDidLoad方法进行交换的方法。

-(void)swizzlingViewDidLoad{

NSString*str=[NSStringstringWithFormat:

@"%@",self.class];

//我们在这里加一个判断,将系统的UIViewController的对象剔除掉

if(!

[strcontainsString:

@"UI"]){

NSLog(@"统计打点:

%@",self.class);

}

[selfswizzlingViewDidLoad];

}

@end

UIView和CALayer是啥关系?

UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它。

它本身完全是由CoreAnimation来实现的(Mac下似乎不是这样)。

它真正的绘图部分,是由一个叫CALayer(CoreAnimationLayer)的类来管理。

UIView本身,更像是一个CALayer的管理器,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等,实际上内部都是在访问它所包含的CALayer的相关属性。

如何高性能的给UIImageView加个圆角?

(不准说layer.cornerRad

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1