以下的这些问题都是些本人在之前找工作的时候遇到的面试问题,我就做了些整理,大概如下,供大家参考下。
一 (这是个直播类的公司的面试问题)
1、KVC和KVO区别
2、内存管理机制是什么样的?
3、轮播图片的实现方法
4、tableview的代理方法有哪些
5、运行时的机制
6、tableview的复用的原理?
7、图文混排的做法
8、响应链是什么?
9、针对项目,假如在scrollview上加scrollview或tableview,只让下面的滑动
10、多线程阐述
11、git命令 举个例。
12、bilibili首页的分析
二(这是个做金融类的公司)
1、自动布局,类似微信的朋友圈
2、轮播图片的实现方法
3、推送原理
4、上架流程
5、SDWebImage的内部实现
6、缓存技术 大概阐述下。
7、瀑布流,怎么检测每列最小的y值
8、自己实现一个tableview和瀑布流
9、自己电脑生成的那个钥匙串有什么用处(生成证书的时候用的)
10、推送的时候,服务器发送的令牌,包含着什么内容
11、轮播图片的时候,假如有定时器,怎么让这个轮播顺畅执行
12、nstimer和一个什么东西的区别,忘了名字了!(忽略吧)
13、MVC模式简要说明
14、XML解析的原理 ,有哪些三方的库。
15、多线程的使用场景
16、开发中遇到的最大问题
17、是否对数据库了解,fmdb 、sqlite3
18、git和SVN的命令 举例
三 (这是个外包公司的问题,问题里面全是坑)
1.在父视图上[UIButton new]时,给左上一个15的约束,会有什么情况发生。
答:由于新建的button没有放在父视图,所以会引发崩溃。
2.用masonry写个离父视图边距15的纯代码
答:make.left.mas_equalTo(self.view.mas_left).offset(15);
3.在父视图上添加一个scrollView 后加一个button或label,怎么添加约束
4.怎么处理网络缓存
5.怎么处理图片缓存,怎么删除缓存
6.AFN2.0和3.0的manager有什么区别(单例和非单例的区别),其他的还有什么区别。
7.SDWebImage的缓存策略,对于图片怎么处理的,以及api接口是哪一个。
sd_setImageWithUrl:(NSUrl *)url placeholder:(UIImage *)image;
8.热修复的原理
9.代码冲突怎么查找,怎么解决,
答:在代码中找到>>>>>>>>
表示冲突的开始位置。
找到<<<<<<<
表示代码冲突的结束位置。
此外还有=========
10.数据库sql语句的添加(新增)字段怎么实现。
答:
添加字段:
alter table 表名 add 字段名 类型
删除字段:
alter table 表名 drop column 字段名
11.最新的xcode版本(他觉得我没有开发过iOS 我去。。。)
12.怎么实现最大并发数
NSOPerationQueue的类
// 最好设置最大并发数为2~3
self.queue.maxConcurrentOperationCount = 3;
13.除此之外问了很多api接口的代码。
14.处理block需要注意的有那些?
答:(1)在使用block前需要对block指针做判空处理。
(2)在MRC的编译环境下,block如果作为成员参数要copy一下将栈上的block拷贝到堆上
(3)在block使用之后要对,block指针做赋空值处理,如果是MRC的编译环境下,要先release掉block对象。
(4)使用方将self或成员变量加入block之前要先将self变为__weak
(5)在多线程环境下(block中的weakSelf有可能被析构的情况下),需要先将self转为strong指针,避免在运行到某个关键步骤时self对象被析构。
第四、第五条合起来有个名词叫weak–strong dance,
参考:http://www.cnblogs.com/biosli/p/block_usage.html
四(也是半外包类的公司)
1.缓存的处理:可以用字典进行处理。
2.对于缓存所占内存过高的时候的处理办法:一般就是设置一个上限值,例如100M,加入缓存达到上限值的话,就可以删除一些没有用的缓存,来降低缓存所占的内存。
3.运行时原理以及消息转发
4.KVO的底层实现原理:就是对对象进行一个拷贝,生成一个全新的对象,对新的对象的属性的进行观测,观测到新旧两个对象的属性值的变化,其中在类的对象中的isa指针会指向类。
5.深拷贝和浅拷贝
6.用socket来封装CFNetworking的实现原理
7.HTTP和TCP/IP的为什么叫短连接和长连接:对于这两个协议来说都是流服务,HTTP是在建立了流服务的连接后,会维持一段时间自动断开连接,且下次连接还需要进行一次完成流程的连接,这是不会有记忆功能的,所以是可靠的。但是TCP/IP的连接是就是在连接完成后,不会自动断开连接,仍然保持连接,所以称为长连接。
8.对于id类型为啥是所以类型的父类:由于是id类型来源NSObject的对象,而其他的类都是继承自NSObject的,所以其他的对象是继承id。
9.对于id来创建对象,为什么不加 * :由于在NSObject创建对象的时候就会有个了,而id只是对其的进一步的封装,所以不用在id再加上了。
10.为什么在tableView上添加一个轮播图片,在下滑上拉的时候,轮播图片停止滚动:原因就是轮播图片加在当前的runloop会自动的停掉。所以滑动界面的时候会使得轮播图片停止滚动,这时需要把轮播图片添加到其他的runLoop中去,这样就算有滑动页面也不会使得轮播图片停止滚动。
11.GCD中的mainQueue和globalQueue有什么区别:mainqueue的话是主队列,这是同步执行的,而globalQueue是可以异步的执行任务的。
12.解决手势冲突的代码:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// 输出点击的view的类名
// 若为UITableViewCellContentView(即点击了tableViewCell),则不截获Touch事件
if ([NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]) {
return NO;
}
return YES;
}
[NSStringFromClass([touch.view class]) isEqualToString:@"UITableViewCellContentView"]
判断这个手势是否添加到相应的控件上。
13.FMDB在多线程中的问题:FMDB是支持多线程的,需要用到的是FMDatabaseQueue,[FMDatabaseQueue databaseQueueWithPath:path]
,然后可以处理多线程的问题,但是在对于多线程安全问题,在同时操作数据库的时候需要异步的执行inDataBase或inTransaction来进行。
五
1.怎么上传图片到服务器,详细流程。
2.事件传递,
3.c指针问题
4.自定义控件怎么传递事件给控制器,几种方式。
5.mvc
6.cell上显示网络数据,网络很慢,cell进了复用池怎么搞
7.你在项目中怎么处理ipv6的问题的
通过getaddrinfo转换ipv4得到ipv6地址(这里我也被坑过了低版本的系统转换不了ipv6,想测试只能升级系统),获得ipv6地址后,可以判断地址字符串是否用“:” 来确定使用哪一种socket的通讯方式,判断方法:std::strdchr(const char* value, const char* subStr)
,如果是NULL,则使用ipv4 socket连接