iOS面试题分析

iOS面试

Model层:
  • 数据持久化存储方案有哪些?
    - plist(XML属性列表归档)
    - 偏好设置
    - NSKeydeArchiver归档(存储自定义对象)
    - SQLite3(数据库,关系型数据库,不能直接存储对象,要编写一些数据库的语句,将     对象拆开存储)
    - Core Data(对象型的数据库,把内部环节屏蔽)
  • 沙盒的目录结构是怎样的?各自一般用于什么场合?
    - Application:存放程序源文件,上架前经过数字签名,上架后不可修改
    - Documents:保存应⽤运行时生成的需要持久化的数据,iTunes同步设备时会备份该目       录。例如,游戏应用可将游戏存档保存在该目录
    - tmp:保存应⽤运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用        没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时 不会备份该目录 
    - Library/Caches:保存应用运行时⽣成的需要持久化的数据,iTunes同步设备时不会备份       该目录。⼀一般存储体积大、不需要备份的非重要数据 
    - Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置) 应⽤会在该⺫录中        查找应⽤的设置信息。iTunes同步设备时会备份该目录 
    
  • SQL语句问题:inner join、left join、right join的区别是什么?
    - 内连接:inner join 或者 join  (显示的是左右表都有完整字段值的记录)
    - 左外连接:left outer join (保证左表数据的完整性)
  • sqlite的优化
    • 不知道
  • 网络通信用过哪些方式(100%的人说了AFNetworking...)
  • 使用苹果自带类 NSURLCollection,xcode7已经被NSURLsession替代
    或者使用第三方框架,AFNetworking,最好封装一下。

1.在开发的时候可以创建一个工具类,继承自我们的AFN中的请求管理者,再控制器中真正发请求的代码使用自己封装的工具类。
2.这样做的优点是以后如果修改了底层依赖的框架,那么我们修改这个工具类就可以了,而不用再一个一个的去修改。
3.该工具类一般提供一个单例方法,在该方法中会设置一个基本的请求路径。
4.该方法通常还会提供对GET或POST请求的封装。
5.在外面的时候通过该工具类来发送请求
6.单例方法:
(instancetype)shareNetworkTools
{
   static XMGNetworkTools *instance;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken, ^{
       // 注意: BaseURL中一定要以/结尾
       instance = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"http://120.25.226.186:32812/"]];
   });
   return instance;
}
  • 如何处理多个网络请求并发的情况
 - 使用GCD 信号量
 - 使用NSOperation 添加依赖
  • 在网络请求中如何提高性能
 - 通过异步请求,开启子线程
  • 在网络请求中如何保证安全性
  • 尽量不要操作同一块内存,可以使用加锁的方式,AFNetworking是线程安全的做了处理
语言与基础知识:

1.内存中的栈和堆的区别是什么?那些数据在栈上,哪些在堆上?

1.栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量等值。其操作方式类似于数据结构中的栈。

2.堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。注堆和数据结构中的堆栈不一样,其类是与链表。

操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segment ”。

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

define宏定义和const常变量区别:
1.define是宏定义,程序在预处理阶段将用define定义的内容进行了替换。因此程序运行时,常量表中并没有用define定义的常量,系统不为它分配内存。
const定义的常量,在程序运行时在常量表中,系统为它分配内存。
2.define定义的常量,预处理时只是直接进行了替换。所以编译时不能进行数据类型检验。
const定义的常量,在编译时进行严格的类型检验,可以避免出错。
3.define定义表达式时要注意“边缘效应”,例如如下定义:
    #define N 2+3 //我们预想的N值是5,我们这样使用N
    int a = N/2;  //我们预想的a的值是2.5,可实际上a的值是3.5

3.什么情况下会出现内存的循环引用

(1)计时器NSTimer
一方面,NSTimer经常会被作为某个类的成员变量,而NSTimer初始化时要指定self为target,容易造成循环引用。 另一方面,若timer一直处于validate的状态,则其引用计数将始终大于0。记得释放

(2)block
block在copy时都会对block内部用到的对象进行强引用(ARC)或者retainCount增1(非ARC)。在ARC与非ARC环境下对block使用不当都会引起循环引用问题,
一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.someBlock = ^(Type var){[self dosomething];或者self.otherVar = XXX;或者_otherVar = ...};
block的这种循环引用会被编译器捕捉到并及时提醒。

(3)委托delegate
在委托问题上出现循环引用问题已经是老生常谈了,本文也不再细讲,规避该问题的杀手锏也是简单到哭,一字诀:声明delegate时请用assign(MRC)或者weak(ARC),千万别手贱玩一下retain或者strong,毕竟这基本逃不掉循环引用了!

4.block中的weak self,是任何时候都需要加的么?

一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.someBlock = ^(Type var){[self dosomething];或者self.otherVar = XXX;或者_otherVar = ...};

5.GCD的queue,main queue中执行的代码,一定是在main thread么?

不一定,如果queue是自己创建的那就在子线程,main queue中的一定是在main thread中的

6.NSOperationQueue有哪些使用方式
不知道

7.NSThread中的Runloop的作用,如何使用?

RunLoop是维持一个线程一直保持运转的,是线程的基本组成成分,RunLoop中至少有一种model model中又至少有事件源 timer事件, ob 其中的一个 

8..h文件中的变量,外部可以直接访问么?(注意是变量,不是property)

不能,需要写变量的get方法 而属性已经直接给我们自动生成了

9.讲述一下runtime的概念,message send如果寻找不到相应的对象,会如何进行后续处理 ?
runtime是oc的运行时机制,其中最重要的是他的消息机制,

RunTime 运行机制 :运行时候的一些机制
>最重要的是消息机制
>方法调用的本质就是让对象发送消息 只有对象能够发送消息,所以使用objc_开头,就算是    类方法也是类对象在发送消息 :发送消息的过程是runtime库会根据isa指针找到对应的    类 在类和父类的方法列表中找 如果在最顶类(NSObject)中也没有找到的话,会报方 法找不到这个错 <oc 给了我们三个拯救的机会 
    (1)Method resolution :调用
        + (BOOL)resolveClassMethod:(SEL)sel 
        + (BOOL)resolveInstanceMethod:(SEL)sel  
     (2) Fast forwarding 
     (3) Normal forwarding
     >
>一些项目中能用的技术
    (1)使用runtime交换方法:系统类 的方法功能不够;1使用继承类,重写方法 2使用runtime交换方法 :使用分类,只有分类才能给系统的类添加方法,并且通过添加的这个方法来进行方法交换,交换步骤在分类的load 方法中调用, 通过class_getClassMethod 
  获取方法地址, 通过 method_exchangeImplementations 交换方法注意的是 在方法交换后如果你在实现自己的方法的时候,要记住系统的方法已经被我们换掉了,所以调用我们自己的方法就代表调用系统的方法
    (2)使用runtime动态添加方法:如果一个类方法非常多,加载类到内存的时候也比较消耗资源,可以使用runtime动态添加方法来解决 <经典面试题:有没有使用performSelector,其实主要想问你有没有动态添加过方法。> :

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

TCP:面向连接、传输可靠(保证数据正确性,保证数据顺序)、用于传输大量数据(流模式)、速度慢,建立连接需要开销较多(时间,系统资源)。

UDP:面向非连接、传输不可靠、用于传输少量数据(数据包模式)、速度快。

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

md5 用户密码存储  文件校验
base64 公开的代码加密  url加密

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

采用二叉树链表作为存储结构,每个左节点均小于父节点,每个右节点均大于父节点
O(log2(n))
架构:

哪些类不适合使用单例模式?即使他们在周期中只会出现一次。

Notification的使用场景是什么?同步还是异步?

简单介绍一下KVC和KVO,他们都可以应用在哪些场景?

- KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知
- KVC是KeyValueCoding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性(实例变量)的机制。而不是通过调用Setter、Getter方法访问
APP相关:

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

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

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

简单介绍下发送系统消息的机制(APNS)

UI:

系统如何寻找到需要响应用户操作的那个Responder

逐层向上抛事件,如果到UIwindow都没有可以处理的报方法找不到异常

多屏幕尺寸的适配

要么使用xib的自动布局,autolayout或者使用屏幕宽度来设置margin也可以比较简单,还有种奇葩的是根据判断机器型号来的(⊙o⊙)

UIButton的父类是什么?UILabel呢?

UIController UIView

push view controller 和 present view controller的区别

描述下tableview cell的重用机制

Tableview会去缓存池中去取绑定标示的cell,(如果不清楚缓存机制,那么就会导致数据展示混乱),自定义不等高cell是常见的tableview处理手段,比较好的做法是在cell的model中重新定义一个height的变量,在setmodel的时候我们就应该吧需要的高度计算好,然后在tableview的rowHeight方法中取出model中的height设置,还有其他的方法,如果是在rowHeight方法中计算,这种方式不可用,会是的tableView卡顿

UIView的frame和bounds的区别是什么

Frame的0,0在父控件上,而bounds是在自身上
最后是几道场景题,也是我最喜欢问的:

发送10个网络请求,然后再接收到所有回应之后执行后续操作,如何实现?

实现一个第三方控件,可以在任何时候出现在APP界面最上层

实现一个最简单的点击拖拽功能。

上面那个拖拽之外,如果在手放开时,需要根据速度往前滑动呢?

如何减小一个应用程序的尺寸?

如何提高一个性用程序的性能?

不同版本的APP,数据库结构变化了,如何处理?

//本人自己添加的一些
Block 链式编程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,757评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,478评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,540评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,593评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,903评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,329评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,659评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,383评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,055评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,337评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,864评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,227评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,820评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,999评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,750评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,365评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,260评论 2 258

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,035评论 29 470
  • 面试题9 1.描述应用程序的启动顺序。 2.为什么很多内置类如UITableViewControl的delegat...
    啧啧啧_野兽阅读 2,154评论 0 26
  • 1,NSObject中description属性的意义,它可以重写吗?答案:每当 NSLog(@"")函数中出现 ...
    eightzg阅读 4,075评论 2 19
  • 过了元宵节又是情人节!都被它刷屏了… 2月14日情人节,不仅仅属于青春洋溢的年轻人,也属于相知多年的中年伴侣和相濡...
    夏秋野菊阅读 282评论 0 2
  • 引言: 一样事物的兴起,必然伴随着根源上的需求。 现如今,各种养生秘诀散落在我们的朋友圈,各大电视台争相开办养生节...
    安之腾阅读 2,423评论 39 77