老胡给的面试题
1.简要描述strong,weak,assign,retain区别以及应用场景
先说assign,assign就是简单的赋值,不做内存层面的改变,简单点说就是两个对象指向同一个内存区,一个地方的变了,其他的地方都会跟着变
retain就是指针拷贝,还是指向同一个内存区,这个对象的retaincount会+1,他的setter方法会将原来的值先release掉,再retain新的值
strong就是强引用,当strong修饰的指针指向的内存发生改变时,因为强引用会持有该对象,指针会指向新的内存
weak弱引用也可以指向那块内存,但是不持有,所以当指针指向的内存发生改变时,weak修饰的指针就会变成空指针
2.写出几个常见的网络请求方式
get:一般只是从服务器获得数据,请求时会提交给服务器一些请求参数,附加在url上,参数之间以&分割
post:多用于给服务器提交数据,提交的数据一般放在body里面,保密性高
3.列出viewController的生命周期以及相关函数,和调用次序
被创建
alloc 创建对象,分配空间
init 初始化
loadview 载入视图
viewdidload 载入完成
viewwillapper 即将出现
viewdidappear 已经出现
移除屏幕
viewwilldisappear 即将移除
viewdiddisappear 已经移除
dealloc 释放
4.写出uiwindow,uiviewcontroller view之间的关系
uiwindow也是uiview的子类,但是一般程序都只会有一个uiwindow,是程序中所有view的根,所有view都必须贴在uiwindow上,或者他的superview的superview直到最底层贴在uiwindow上
uiviewcontroller负责管理uiview的层次结构,响应程序
5.是否了解containerviewcontroller的概念,如果了解请列出常见的containerviewcontroller
概念就是一个viewcontroller显示的一部分属于另外一个viewcontroller
我们常用的UINavigationController,UITabBarController就属于
6.block的起源与oc的写法,自定义一个类型block,描述一下block在arc和mrc下内存存放的位置
block是c的扩充功能
typedef int(^Myblock)(int,int);
静态变量在栈上
全局变量在全局数据区域
没有引用变量的存于堆
arc会自动将block从栈复制到堆上
mrc下需要显示执行copy活着release方法
7.常用的开源库框架
fmdb afnetworking sdwebimage
8.通知消息和代理的的区别
通知时多对多
代理一般是一对一
9.类继承和类扩展区别,类别
继承可以增加,修改,删除方法,嗨可以增加属性
扩展可以增加属性,扩展增加的方法必须实现
类别可以增加属性和方法
10.复述一下uitableview的复用机制
创建一个数组当作cell的复用池,通过计算偏移量来计算cell师傅已经移出屏幕,如果移出,就将cell从table上移除,加到复用池中
同理,判断偏移量,计算出需要一个新的cell显示在屏幕上时,需要先从复用池找看有没有对应的cell,如果有就直接拿出来用,没有,就实例化新的cell
11.复述一下arc和mrc下的区别,以及oc里面混编需要做的修改
arc时自动内存管理
mrc下需要自己释放自己申请的内存
混编需要加上-fno-objc-arc标记
12.如果要你自己写一个mjrefresh,写一下思路,如果能用代码实现可以用代码实现
13.说一下你对runtime的理解
runtime是一套比较底层的纯C语言API, 属于1个C 语言库, 包含了很多底层的C语言API,在我们平时编 写的OC代码中, 程序运行过程时, 其实最终都是转成 了runtime的C语言代码, runtime算是OC的幕后工 作者
14.kvc和kvo的理解
KVO 可以观察某个对象的变量变化过程,KVC 是 满足被观察的编码规范。
15.sdwebimage的原理及作用
先显示placeholder的图片,然后再缓存区寻找,如果有,就显示,没有,就创建一个新线程,去本地硬盘找,找到了,就存到缓存,并显示,没有,则开始下载,下载结束,显示图片并缓存到缓存和硬盘