ios面试
Ⅰ iOS开发会面试哪些问题
1、浅复制和深复制的区别?2、obc中的协议和java中的接口概念有何不同? 3、解释内一下KVO 和 KVC? 4、通知和协议的容不同之处? 每个公司的面试题不一样,可以下载“猿人部落”问问里面大牛,这样全面一些。
Ⅱ 知乎上的一个怎么面试iOS工程师的问题
1.什么是arc?(arc是为了解决什么问题诞生的?)
首先解释ARC: automatic reference counting自动引用计数。
ARC几个要点:
在对象被创建时 retain count +1,在对象被release时 retain count -1.当retain count 为0 时,销毁对象。
程序中加入autoreleasepool的对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁。
那么ARC是为了解决什么问题诞生的呢?这个得追溯到MRC手动内存管理时代说起。
MRC下内存管理的缺点:
1.当我们要释放一个堆内存时,首先要确定指向这个堆空间的指针都被release了。(避免提前释放)
2.释放指针指向的堆空间,首先要确定哪些指针指向同一个堆,这些指针只能释放一次。(MRC下即谁创建,谁释放,避免重复释放)
3.模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁去释放。
4.多线程操作时,不确定哪个线程最后使用完毕
2.请解释以下keywords的区别: assign vs weak, __block vs __weak
assign适用于基本数据类型,weak是适用于NSObject对象,并且是一个弱引用。
assign其实也可以用来修饰对象,那么我们为什么不用它呢?因为被assign修饰的对象在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil。如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。
而weak修饰的对象在释放之后,指针地址会被置为nil。所以现在一般弱引用就是用weak。
首先__block是用来修饰一个变量,这个变量就可以在block中被修改(参考block实现原理)
__block:使用__block修饰的变量在block代码快中会被retain(ARC下,MRC下不会retain)
__weak:使用__weak修饰的变量不会在block代码块中被retain
同时,在ARC下,要避免block出现循环引用 __weak typedof(self)weakSelf = self;
3.__block在arc和非arc下含义一样吗?
是不一样的。
在MRC中__block variable在block中使用是不会retain的
但是ARC中__block则是会Retain的。
取而代之的是用__weak或是__unsafe_unretained来更精确的描述weak reference的目的
其中前者只能在iOS5之後可以使用,但是比较好 (该物件release之後,此pointer会自动设成nil)
而後者是ARC的环境下为了相容4.x的解决方案。
所以上面的范例中
__block MyClass* temp = …; // MRC环境下使用
__weak MyClass* temp = …; // ARC但只支援iOS5.0以上的版本
__unsafe_retained MyClass* temp = …; //ARC且可以相容4.x以後的版本
4.使用nonatomic一定是线程安全的吗?()
不是的。
atomic原子操作,系统会为setter方法加锁。 具体使用 @synchronized(self){//code }
nonatomic不会为setter方法加锁。
atomic:线程安全,需要消耗大量系统资源来为属性加锁
nonatomic:非线程安全,适合内存较小的移动设备
5.描述一个你遇到过的retain cycle例子。
block中的循环引用:一个viewController
@property (nonatomic,strong)HttpRequestHandler * handler;
@property (nonatomic,strong)NSData *data;
_handler = [httpRequestHandler sharedManager];
[ downloadData:^(id responseData){
_data = responseData;
}];
1
2
3
4
5
6
self 拥有_handler, _handler 拥有block, block拥有self(因为使用了self的_data属性,block会 一份self)
解决方法:
__weak typedof(self)weakSelf = self
[ downloadData:^(id responseData){
weakSelf.data = responseData;
}];
1
2
3
4
6.+(void)load; +(void)initialize;有什么用处?
在Objective-C中,runtime会自动调用每个类的两个方法。+load会在类初始加载时调用,+initialize会在第一次调用类的类方法或实例方法之前被调用。这两个方法是可选的,且只有在实现了它们时才会被调用。
共同点:两个方法都只会被调用一次。
7.为什么其他语言里叫函数调用, objective c里则是给对象发消息(或者谈下对runtime的理解)
先来看看怎么理解发送消息的含义:
曾经觉得Objc特别方便上手,面对着 Cocoa 中大量 API,只知道简单的查文档和调用。还记得初学 Objective-C 时把[receiver message]当成简单的方法调用,而无视了“发送消息”这句话的深刻含义。于是[receiver message]会被编译器转化为:
objc_msgSend(receiver, selector)
如果消息含有参数,则为:
objc_msgSend(receiver, selector, arg1, arg2, ...)
如果消息的接收者能够找到对应的selector,那么就相当于直接执行了接收者这个对象的特定方法;否则,消息要么被转发,或是临时向接收者动态添加这个selector对应的实现内容,要么就干脆玩完崩溃掉。
现在可以看出[receiver message]真的不是一个简简单单的方法调用。因为这只是在编译阶段确定了要向接收者发送message这条消息,而receive将要如何响应这条消息,那就要看运行时发生的情况来决定了。
Objective-C 的 Runtime 铸就了它动态语言的特性,这些深层次的知识虽然平时写代码用的少一些,但是却是每个 Objc 程序员需要了解的。
Objc Runtime使得C具有了面向对象能力,在程序运行时创建,检查,修改类、对象和它们的方法。可以使用runtime的一系列方法实现。
Ⅲ iOS:面试一般问哪些
目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了。今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡。矫情一下,言归正传,我奉献一下,为iOS应聘者梳理一下面试题,希望能助一臂之力!
OC的理解与特性
OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装、继承、多态。它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定、动态加载等)。总体来讲,OC确实是一门不错的编程语言,
Objective-C具有相当多的动态特性,表现为三方面:动态类型(Dynamic typing)、动态绑定(Dynamic binding)和动态加载(Dynamic loading)。动态——必须到运行时(run time)才会做的一些事情。
动态类型:即运行时再决定对象的类型,这种动态特性在日常的应用中非常常见,简单来说就是id类型。事实上,由于静态类型的固定性和可预知性,从而使用的更加广泛。静态类型是强类型,而动态类型属于弱类型,运行时决定接受者。
动态绑定:基于动态类型,在某个实例对象被确定后,其类型便被确定了,该对象对应的属性和响应消息也被完全确定。
动态加载:根据需求加载所需要的资源,最基本就是不同机型的适配,例如,在Retina设备上加载@2x的图片,而在老一些的普通苹设备上加载原图,让程序在运行时添加代码模块以及其他资源,用户可根据需要加载一些可执行代码和资源,而不是在启动时就加载所有组件,可执行代码可以含有和程序运行时整合的新类。
Ⅳ 2018iOS面试题
1.进程和线程的区别
2.如何保证线程安全
3.了解哪些设计模式
4.MVC设计模式的思想是什么
5.堆和栈专的区别,工程属项目中的哪些数据是储存在堆哪些在栈中
6.iOS中的NSCopying协议,,MutableCopy的区别
7.解释属性修饰关键词的作用
8.tcp为什么要进行三次握手?不是2次,4次
9.HTTP为什么底层是TCP不是UDP
10.Blcok,NSNotification,delegate,Observer比较
Ⅳ ios面试项目难点有哪些
首先,谈一下面试前的准备,分为两个方面;
—:广泛阅览面试题目,找出重点题目,事先将答案记好。很多人以为自己做了几个项目,平时也有认真学习,不屑于去临时抱佛脚,这是大错特错的,很多你了解的东西到面试时会由于心理压力,而让你表诉不清楚,面试官听的似懂非懂,结果不言而喻,广泛阅读也让你在面试时显得涉猎广,游刃有余。
二:重中之重,简历的书写,一份好的简历让你在别人开口前,印象分就多了20分。简历分三个方面:(1)个人信息(2)个人技能(3)项目经验;最后再加上点个人评价(一两句话即可,写一句“适应力强,自学力强”通用。切忌写一大堆。)
面试核心思想:引导面试官(过程中体会,结尾总结)。礼仪,着装我就不说了,大家都是成年人。
一般来说,如果你是同几个人一起面试,不要做第一个,原因很简单,你看看“我是歌手”你就明白了。当面试了好几个人后,第一个人的印象会降低,但凡a,b,c能力相差无几,b,c成功率要高过a,另一个重要原因是,后者通常会被问到a没答好的问题,你若是能答好,高下立判。至于答不好,面试官也觉得你们一个水平。
Question 1:什么是面向对象。
切入: 面试官要的不是答案本身,而是你的逻辑表述,理解,及应用。
答:面向对象是区别于面向过程而言的,面向过程可以表述为:程序 = 算法+ 数据结构 ;面向对象可以表述为 程序 = 对象 + 消息。
面向对象是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程。 我们强调“万物皆对象”,我们抽象他们的属性与行为出来,以代码的形式展现。它有三个基本特征
1.封装:
封装就是,隐藏内部具体实现,只提供接口方法去访问。比如我们调用NSString类的,截取,拼接方法时,我们并不需要具体的算法,而只需调用相应方法。
2. 继承:
它是面向对象的程序中两个类之间的一种关系,即一个类可以从另一个类(即它的父类)继承状态和行为。继承父类的类称为子类。
继承的优越性:通过使用继承,程序员可以在不同的子类中多次重新使用父类中的代码,使程序结构清晰,易于维护和修改,而子类又可以提供一些特殊的行为,这些特殊的行为在父类中是没有的 。
3.多态:
是指一个程序中同名的方法共存的情况,调用者只需使用同一个方法名,系统会根据不同情况,调用相应的不同方法,从而实现不同的功能。多态性又被称为“一个名字,多个方法”。
以上的操作就是为了实现代码复用,实现代码的可移植性,灵活性,及低耦合,高内聚。
一个问题居然写了这么多。。。。。。
Question 2:简单介绍下你做的项目(这里就是开始引导面试官了,如果他不问这个问题,你就自己提出来,你要知道面试官其实也紧张,他不知道你会些什么,它可能懂得多,却也有无从下手的感觉,你递个枕头,他肯定会接的。)
答:(选取你自己会的答,比如)我用到了自定义cell显示数据,使用三方框架AFNetworking,ASIHttpRequest,访问网络,拿到Jason,XML格式数据,然后进行一些数据的解析,本地存储,还有用xmpp实现的即时聊天,在本地用代理,通知,block进行类之间的通信,并植入了地图,实现了上拉加载,下拉刷新功能。。。。。
看到没有,面试问题就出来了
1.讲一下tableViewCell的复用问题(重点)
这是指它的重用机制,先明白为什么要重用,无他:效率,内存。
查看UITableView头文件,会找到NSMutableArray* visiableCells,和NSMutableDictnery* reusableTableCells两个结构。visiableCells内保存当前显示的cells,reusableTableCells保存可重用的cells。
TableView显示之初,reusableTableCells为空,那么tableView :CellIdentifier返回nil。开始的cell都是通过[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]来创建,而且cellForRowAtIndexPath只是调用最大显示cell数的次数。
比如:有100条数据,iPhone一屏最多显示10个cell。程序最开始显示TableView的情况是:
1. 用[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]创建10次cell,并给cell指定同样的重用标识(当然,可以为不同显示类型的cell指定不同的标识)。并且10个cell全部都加入到visiableCells数组,reusableTableCells为空。
2. 向下拖动tableView,当cell1完全移出屏幕,并且cell11(它也是alloc出来的,原因同上)完全显示出来的时候。cell11加入到visiableCells,cell1移出visiableCells,cell1加入到reusableTableCells。
3. 接着向下拖动tableView,因为reusableTableCells中已经有值,所以,当需要显示新的cell,cellForRowAtIndexPath再次被调用的时候,tableView :CellIdentifier,返回cell1。cell1加入到visiableCells,cell1移出reusableTableCells;cell2移出visiableCells,cell2加入到reusableTableCells。之后再需要显示的Cell就可以正常重用了。
2.讲一下如何根据内容自定义cell行高
以前用的三方RTLabel(非arc,int,NSInteger等问题,方法过老,版本无跟新,以弃用)
// iOS6中的方法,在iOS7中弃用了
/* CGSize textSize = [textArray sizeWithFont:[UIFont systemFontOfSize:16.0] constrainedToSize:CGSizeMake(280, 100000000) lineBreakMode:NSLineBreakByWordWrapping];*/
// 定义一个字典,里面还可以放入其他属性,不仅仅是字体大小
NSDictionary *attribute = @{NSFontAttributeName: [UIFont systemFontOfSize:15.0]};
//iOS7中提供的计算文本尺寸的方法 CGSize textSize1 = [textArray boundingRectWithSize:tableView.bounds.size options: | attributes:attribute context:nil].size;
NSLog(@"%f",textSize1.height);
3.讲一下AFNetworking,ASIHttpRequest
3.jason和xml的区别(重点)
底层展现不同,比如jason用{}表示字典[]数组
4.本地数据如何存储,用到些什么方法(重点)
coredata,NSUserDefaultCenter,数据库,写入文件
5.xmpp的理解
6.代理,通知,和block的区别(重点)
代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。另外一点,代理可以理解为java中的回调监听机制的一种类似。
代理通知区别,代理通常一对一,需要返回数据,通知一对多,不需要返回数据,block是ios4以后使用,方便,但是格式怪异。
7.讲一下下拉刷新的实现
8.用到过什么地图
9.用过数据库吗,增删改查关键字(重点)
10.自定义过什么控键吗
11.viewcontroller的生命周期(重点)
12.网络安全问题(重点)
从get post 出发,谈到数据md5加密,协议安全,源代码安全
13.数据库安全问题
14.多线程问题
15.数据结构,堆栈问题
16.循环引用
17.线程,进程
17.最后一个arc非arc,自动释放池(重点)
Ⅵ ios面试谈谈开发中遇到过哪些坑
这个问题 你还是问那些专业的iOS开发人员吧。。。那个国信安的老师,很不错。。可以问问。。
Ⅶ ios面试需要注意什么
1.仪态得当
正所谓,人靠衣装。衣着是否整洁得体,发型是否利落,精神面貌是否神采奕奕,决定了面试官对求职的第一印象。为了让面试官第一眼就对你充满好感,你需要在穿着上注重细节,一套得体的服装,干净利落的气质,能大大提高你面试成功的几率。
2.保持自信
谈谈自己,一般是iOS面试的“前菜”,对于求职者来说,这是一个证明自己有多优秀的机会。如果你准备了一大堆溢美之词来包装自己,不妨根据企业的用人标准,挑选最能代表自己能力、最能说明自己经验和优点的具体事迹来说。在回答问题过程中,保持谦虚但不可过分谦卑,尤其是对于技术问题更要备足信心。没有公司愿意雇佣对自己技术都信心不足的员工。
3.切忌说话不经大脑,背诵解决方案
在面试过程中,你需要展现你的应变能力,但并非是不经大脑地脱口而出。做iOS需要严谨的思维,在回答问题之前最好理一下自己的思路,快但却没条理的回答只会暴露你缺乏思考能力、粗心的缺点。如果你事先做的功课正好是面试官提出的问题,切忌一味背诵答案,结合你自己的实际经验来侃侃而谈,一定会赢得面试官的好感。
4.不要写上你不清楚的技术
面试之前,你需要好好回顾一下自己做过的项目,展现自己在团队中的重要作用,都会为你实现高薪大大加分。尽可能更全面地展现出你在iOS编程上的技能,让面试官对你的能力有更全面的了解,但切勿在简历中写上自己并不清楚的技术。在技术更新极快的当下,编程过程中总会遇到一些自己不清楚的问题,而面试官更看重的是你的态度。写上你并不熟悉的技术,问题稍微深入一些你就容易露馅。假如你是诚信而勇于挑战的话,面试官一定会对你青睐有加。
Ⅷ 如何面试 ios 工程师
面试经抄历:
人事邮件本来约的11点打电话过来面试,然,结果到11.25才打过来。合肥的一个人打过来的。让我自我介绍,然后问的都是一些简单的基础知识,可能太在意了回答的不够流畅的。但是改说的东西我多说了。可能就是项目架构设计没讲好,最后被Pass了。
面试官提的问题:
1. 什么是arc?(arc是为了解决什么问题诞生的?)2. 请解释以下keywords的区别: assign vs weak, __block vs __weak3. __block在arc和非arc下含义一样吗?4. 使用atomic一定是线程安全的吗?5. 描述一个你遇到过的retain cycle例子。(别撒谎,你肯定遇到过)6. +(void)load; +(void)initialize;有什么用处?7. 为什么其他语言里叫函数调用, objective c里则是给对象发消息(或者谈下对runtime的理解)8. 什么是method swizzling?9. UIView和CALayer是啥关系?10. 如何高性能的给UIImageView加个圆角?(不准说layer.cornerRadius!)
Ⅸ 如何面试 iOS 工程师
程序员面试iOS开发工程师都会遇到哪些问题?下面是一些问题分享,希望对以后的面试会有所帮助。
首先需要声明的是,此次的面试者大多在有1~3年的iOS开发经验,并非需要找一个真正的大牛,所以准备的题目,自己觉得大多数还是比较基础,比较能够看出这个层次的人的水准的。如果也是个有3年左右开发经验的从业者,不妨一试。
面试开始的时候,会让面试者选择一个他最熟悉的项目,给介绍一下它的技术架构,以及面试者在其中参与的模块和具体工作。事实上,很多开发者并不明白提到的“架构”的具体意思,有些人说了一大堆产品的功能,还有人说的非常笼统(比如,遵循MVC架构之类),一般这种时候会打断他们,直接让他们给讲一下这个APP的层次结构,或者是核心模块等。
之后会问两个问题:
1. 讲述一次在这个APP中,用户触发了一个事件,引起了一个服务请求,然后获取服务端返回,并且更新前端界面的过程。请说的详细一点,比如数据经过了哪些类的处理,每一次传递时的格式是怎么样的?
2. 参与的APP,是如何处理多个服务的同步发起的?随后让面试者说一下APP的界面架构,这个比较随意。
问完了项目,就开始基础知识题啦~
Model层:
数据持久化存储方案有哪些?
沙盒的目录结构是怎样的?各自一般用于什么场合?
SQL语句问题:inner join、left join、right join的区别是什么?
sqlite的优化
网络通信用过哪些方式(100%的人说了AFNetworking...)
如何处理多个网络请求并发的情况
在网络请求中如何提高性能
在网络请求中如何保证安全性
语言与基础知识:
内存中的栈和堆的区别是什么?那些数据在栈上,哪些在堆上?
#define和const定义的变量,有什么区别
什么情况下会出现内存的循环引用
block中的weak self,是任何时候都需要加的么?
GCD的queue,main queue中执行的代码,一定是在main thread么?
NSOperationQueue有哪些使用方式
NSThread中的Runloop的作用,如何使用?
.h文件中的变量,外部可以直接访问么?(注意是变量,不是property)
讲述一下runtime的概念,message send如果寻找不到相应的对象,会如何进行后续处理 ?
TCP和UDP的区别是什么?
MD5和Base64的区别是什么,各自场景是什么?
二叉搜索树的概念,时间复杂度多少?
架构:(招的不是架构师,这方面问的不多,而且从之前对APP的架构介绍里可以边听边问)
哪些类不适合使用单例模式?即使他们在周期中只会出现一次。
Notification的使用场景是什么?同步还是异步?
简单介绍一下KVC和KVO,他们都可以应用在哪些场景?
APP相关:
如何添加一个自定义字体到工程中
如何制作一个静态库/动态库,他们的区别是什么?
Configuration中,debug和release的区别是什么?
简单介绍下发送系统消息的机制(APNS)
UI:
系统如何寻找到需要响应用户操作的那个Responder
多屏幕尺寸的适配
UIButton的父类是什么?UILabel呢?
push view controller 和 present view controller的区别
描述下tableview cell的重用机制
UIView的frame和bounds的区别是什么
最后是几道场景题,也是最喜欢问的:
发送10个网络请求,然后再接收到所有回应之后执行后续操作,如何实现?
实现一个第三方控件,可以在任何时候出现在APP界面最上层
实现一个最简单的点击拖拽功能。
上面那个拖拽之外,如果在手放开时,需要根据速度往前滑动呢?
如何减小一个应用程序的尺寸?
如何提高一个性用程序的性能?
不同版本的APP,数据库结构变化了,如何处理?
平心而论,这些题目并没有特别难,没有讲到黑科技,也没有讲到ACM算法题,都是iOS的基础概念以及很容易遇到的场景。可能也是因为招的目标,也只是一个可以完成业务开发的3年左右经验的人而已,所以大部分面试者水平并不如意,能答出以上大半题目,同时思路清晰态度积极向上的人,不到四分之一吧...
另外的感想就是,这个行业可能真的有点浮躁,很多面试者,连简单的几个场景题都答不出来,基础知识更是一般,只会用几个第三方库,就开口要25~30w的年薪,还有一种爱理不理的感觉。也有些人,在原来的公司,自称是技术负责人,但连APP的基本架构,包括哪些主要模块都讲不清楚,各种兜圈子,甚至有人讲了半天的产品功能和亮点,不得不一次次打断才能继续面试。
学iOS,做的事情越多,越觉得自己有越多的东西要学,离大牛的标准也是越来越远。而无论从深度还是广度来看,iOS开发都是一个值得挖掘的技术领域。由于苹果产品的火热,市场上的iOS开发一直供不应求,但真正有能力,高素质的可能真的不那么多。