1.内存分区情况:
a.代码区:存放函数二进制代码;
b.数据区:系统运行时申请内存并初始化,系统退出时由系统释放,主要存放常量,静态变量,全局变量;
c.堆区:通过malloc等函数或者new动态申请到的,需要程序员手动申请和释放;
d.栈区:函数模块内申请,函数结束时由系统自动释放。存放局部变量,函数参数。
2.队列和栈的区别:
队列和栈是两种不同的数据容器,从数据结构的角度来说都是线性结构的,区别在于队列是一种先进先出的数据结构,在队列的两端都可以进行数据的操作,一端进行入队列操作,另一端进行出队列操作,而对于栈来说,栈是先进后出的方式,而且只能在栈顶进行数据的操作。
3.http协议中post和get请求的区别
post请求:
a.提交的参数包含在消息主体内,外界看不到请求数据;
b.提交的数据大小没有限制;
c.可以设置书签
get请求:
a.提交的参数不包含在消息体内,数据放在请求行
b.提交的数据大小有限制
c.不可以设置书签
4.Quartz 2D的绘图功能的三个核心概念
上下文:主要用于描述图形写入哪里
路径:是在图层上绘制的内容
状态:用于保存配置变化的值,填充和轮廓
5.Objective-c里面的NSInteger和int的区别
NSInteger是基本数据类型对象,不是NSNumber的子类,也不是NSObject的子类。NSInteger是int或者long的别名,区别在于NSInteger会根据系统是32位还是64位来决定本身是int还是long
6.Objective-c中创建线程的方法有哪些?在主线程中执行代码的方法是什么?延时执行代码的方法是什么?
创建线程的方法主要有三种:使用NSThread创建,使用GCD的dispatch创建,使用子类化的NSOperation,然后将其加入到NSOperarionQueue中。在主线程执行代码,方法是performSelectorOnMainThread,如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:
7.类别,类扩展和继承的比较
类别只能添加方法,不能添加属性,类扩展和继承可以添加属性,继承可以删除,修改方法,类比不能,类扩展添加的方法必须要实现,类扩展类似私有的类别
8.UIView和UIWindow,CALayer的联系和区别
UIView是视图基类,UIViewController是视图控制器基类,UIResponder是可以用来表示一个可以在屏幕上响应触摸事件的对象。
UIWindow是UIView的子类,主要有两个作用,一是提供一个区域用来显示UIView,二是用来分发事件,一个应用基本上只有一个UIWindow。
CALayer和UIView的区别:
CALayer是继承自NSObject,而UIView的继承结构是UIResponder:NSObject,从两者的继承结构可以看出,UIView可以响应触摸事件,而CALayer是不能响应触摸事件的,两者所属框架也不同,UIView来自UIKit框架,CALayer来自QuartzCore框架,CALayer的坐标系统多了一个anchorPoint的属性。
9.__block和__weak的区别
__block不管是在ARC还是MRC下都可以使用,可以修饰对象,也可以用来修饰基本数据类型
__weak只能在ARC模式下使用,只能修饰对象,不能修饰基本数据类型
__block对象可以在block中重新赋值,__weak不可以
10.常见的http状态码有哪些
http状态码:302代表请求重定向,500以上是服务器错误,400以上是地址错误或者找不到服务器,200以上是正确,100以上是请求接受成功。
11.static关键字的作用
函数体内的static变量的作用范围为该函数体,该变量的内存只被分配一次,其值在下次调用时还是维持上一次的值
类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝
类中的static成员函数属于整个类所拥有,这个函数不接收this指针,所以只能访问类的static成员变量
12.堆和栈的区别
管理方式上,栈是由编译器自己去管理,堆是由程序员去管理。
申请大小上,栈是向低地址扩展的数据结构,是一块连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的,能从获得的空间较小;堆是向高地址扩展的数据结构,是不连续的内存区域。用的是链表的方式进行存储,堆的大小受限于系统中有效的虚拟内存的大小,堆获得的空间比较灵活,也比较大。
碎片问题上,堆会频繁的申请,释放,而且不是连续的,容易造成大量的碎片,对于栈来讲,就不会造成碎片空间,因为站是先进后出,是连续的内存区域
分配效率上,栈是由编译器管理,分配效率更高一点。