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做过什么动画或者图像上的内容

 

posted @ 2015-12-14 17:39  莫莫smile1  阅读(158)  评论(0编辑  收藏  举报