iOS 面试
1、main()
{ int a[5]={1,2,3,4,5};
int *ptr=(int*)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
第一个:2,a指向数组首地址a[1]=2;
第二个:a是一个数组名,也就是数组的首地址。
对a进行取地址运算符,得到的是一个指向数组的指针!!!!这句话尤为重要!也就相当于
int (*p) [5] = &a;p是一个指针,它指向的是一个包含5个int元素的数组!!
那么执行p+1后,p的偏移量相当于 p + sizeof(int) * 5,而程序中强制将指针p转换成一个int* 那么 p -1 其实就是 p - sizeof(int)所以,p -1 指向了数组中得最后一个元素,也就是 5
2、oc没有多重继承,是用协议(protocol)来代替
3、oc类里面的方法只有两种,静态方法和实例方法,所有实例变量都是默认私有的,所有实例方法默认都是共有的。
4、const意味着“只读”,const int a;int const a;声明只读的整型变量a,
const int *a;a是一个指向长整型数的指针,整型数不可修改,但指针可以修改
int* const a;a是一个指向整型数的长指针,整型数可修改,但指针不可修改
int const* a const;a是一个指向长整型数的长指针,都不可修改
阻止变量被修改,使用const关键字
对指针来说,可以指定指针本身为const,也可指定指针所指的数据为const,或二者同时为const
在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值
对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量
5、static的作用
函数体内static变量的 作用范围是该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值。
在模块内的static全局变量可以被模块内所有函数访问,但不能被模块外的其他函数访问。
在模块内的static函数只可被这一模块的其他函数调用,这个函数的使用范围被限制在声明它的模块内。
在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝
在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因此只能访问类的static成员变量
6、extern"C"的作用
被它限定的函数或变量是extern类型的
被它修饰的变量和函数是按照c语言方式编译和连接的
7、#import,#include的区别,@class呢?
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import,#import比#include的好处是不会引起交叉编译
8、oc的优点 cateogies, Posing, 动态识别,指标计算,弹性讯息快递、不是过度复杂的c衍生语言,可与c++混合编程
9、命名空间:不支援命名空间,不支持运算符重载,不支持多重继承,使用动态运行时的类型,都是函数调用,很多编译时的优化方法用不到
10、内存管理
11、自动释放池
12、堆和栈
对于栈来讲,是由编译器自动管理,对于堆来说,释放工作由程序员控制,容易产生内存泄漏
栈在widows系统下,是向低地址扩展的数据结构,是一块连续的内存区域,能从栈获得的空间较小
堆:堆事向高地址扩展的数据结构,是不连续的内存区域,获得空间比较灵活,也比较大。
区别:碎片问题:对于堆来讲,频繁的new/delete会造成内存空间的不连续,从而造成大量碎片,使程序效率降低。对于栈来讲,因为栈是先进后出的队列,以至于永远不可能有一个内存块从栈中间弹出
分配方式:堆是动态分配的,栈有两种分配方式:静态分配和动态分配
分配效率:栈是机器系统提供的数据结构,计算机底层对栈提供支持,堆是c/c++函数库提供的,它的机制是很复杂的
12、swift新特性
支持所有c和oc的基本类型
提供了两种功能强劲的集合类型-Array和Dictionary
支持一种新的高级类型-元组
可选类型
支持闭包的特性
支持脚本语言的特性,能高效地编译运行
中级:
1、mvc
2、线程和进程
两者关系:
一个线程只属于一个进程,而一个进程可以有多个线程,但至少有一个线程
资源分配给进程,同一进程的所有线程共享该进程的所有资源
线程在执行过程中,需要协作同步。不同进程的线程之间利用消息通信的办法实现同步
真正在处理机上运行的是线程
线程是指进程内的一个可执行单元,也是进程内的可调度实体
两者区别:
调度:线程作为调度和分配的基本单元,进程作为拥有资源的基本单位
并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行
拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属进程的资源
系统开销:创建、撤销进程的开销比较大
3、进程的同步机制
原子操作、信号量机制、自旋锁、分布式系统等
4、进程死锁的原因
资源竞争以及进程推进顺序非法
5、死锁的4个必要条件
互斥、请求保持、不可剥夺、环路
6、死锁处理
鸵鸟策略、预防策略、检测与解除死锁
7、KVC和KVO
KVC:键值编码,是一种间接访问对象实例变量的机制,该机制可以不通过存取方法就可以访问对象的实例变量
KVO: 键值监听,是一种使得对象获取其他对象属性变化的机制
实现KVO模式,被观察的对象必须使用KVC键值编码来修改它的实例变量,这样才能被监听
8、深复制、浅复制
深复制:不仅复制对象本身,对象持有的属性对象也做复制
浅复制:只复制对象本身,不对里面的属性复制
9、assign、retain、copy、nonatomic
assign:普通赋值,一般用于基本数据类型,常见委托设计模式,以防止循环引用
retain:保留计数,获得对象的所有权,引用计数在原有基础上加1
copy:一般字符串使用copy。Foundation中的不可变对象使用copy效果相当于retain,只是引用计数+1
nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能
10、ARC情况下,strong与weak,_unsafe _unretained与weak的区别
strong:强引用,weak:弱引用,在ARC中,使用strong告诉编译器自动插入retain,weak相当于手动管理内存的assign
_unsafe _unretained与weak功能一致,区别在于当指向的对象销毁后,weak会将变量置为nil,防止调用野指针
11、ARC存在内存泄漏吗?
循环引用导致内存泄漏,oc对象与CoreFoundation类之间桥接时,管理不当也会产生内存泄漏
12、事件响应者链
响应者链表示一系列的响应者对象。事件被交由第一响应者对象处理,如果第一响应者不处理,事件被沿着响应者链向上传递,交给下一个响应者(next responder)
view->viewcontroller->window->application->丢弃事件
13、svn、git使用
14、打包静态库
15、App发布上架流程
16、storyboard的使用
高级:
1、CALayer与UIView的区别?
两者的最大区别就是,图层(CALayer)不会直接渲染到屏幕上。uiview是iOS系统中界面元素的基础,所有的界面元素都继承自它。它本身是由CoreAnimation来实现的。真正的绘图部分由一个CALayer类来管理。一个uiview上可以有n个CALayer,每个layer显示一种东西,增强uiview的展现能力
2、GCD
GCD是apple开发的一个多核编程的较新的解决办法
是一个替代诸如NSThread等技术的很高效和强大的技术,完全可以处理如数据锁定、资源泄漏等复杂的一步编程问题
扩展知识:(操作队列、异步,同步)
3、TCP和UDP
TCP:传输控制协议,提供面向连接的、可靠的、点对点的通信
UDP:用户数据报协议,提供非连接的,不可靠的点到多点的通信
4、socket连接和http连接
http:短连接,客户端项服务端发送一次请求,服务端响应连接即会断掉
socket:长连接,一旦建立不会主动断掉
5、TCP的三次握手
第一次:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等服务器确认
第二次:服务器端收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN(syn=k)即SYN+ACK包,此时服务器进入SYN_RECV状态
第三次:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务端进入ESTABLISHED,完成三次握手
6、iOS对象通信方式
代理、block、通知、KVO
7、http,https
短连接,都是客户端主动发送请求,服务器作出响应,然后断开。GET没有请求体,POST有请求体
https:安全超文本传输协议。使用安全套接字层(SSL)进行信息交换
8、xml与json数据解析
XML解析方式:DOM解析和SAX解析
DOM解析必须先完成DOM树的构造,在处理规模较大的XML文档时很耗内存,占用资源比较多
SAX是用事件驱动模型,解析XML文档时每遇到一个开始或者结束标签、属性或者一条指令,程序就产生一个事件来进行相应的处理。SAX更适合较大的文档
json解析比较好用的是第三方的JSONKIT和iOS自带的json解析类
9、taleview的复用,设计模式
10、core Data
11、断点续传
12、Core开头的系列内容,CoreAnimation和CoreGraphics,分别使用CA和CG做过什么动画或者图像上的内容