面试题1
1.简述UIView与CALayer的区别
两者最大的区别是:
(1)图层不会直接渲染到屏幕上,UIView是IOS系统中 界面元素的基础,所有的界面元素都是继承自它。
(2)UIView的绘图部分是由一个CALayer类来管理的。UIView本身更像是一个CALayer的管理器。一个UIView上可以有多个CALayer,每个layer显示一种东西,增强UIView的展现能力。
2.什么是“引用”?声明和使用“引用”要注意哪些问题?
引用就是某个目标变量的“别名”,对引用的操作与对变量直接操作效果完全相同。声明一个引 用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量有两个名称,即该目标原 名称和引用名,不能再把该引用明作为其他变量名的别名。声明一个引用,不是新定义了一个变 量,它只表示该引用名是目标变量名的一个别名,他本身不是一种数据模型,因此引用本身不占 存储单元,系统也不给引用分配存储单元。不能建立数组的一引用。
3.类方法与对象方法的区别,alloc 和init的区别
类方法是在程序中直接使用类名来调用的方法,对象方法是需要使用类的实例化变量来调用的方 法,成员变量不可以在类方法中使用,成员变量是依附于对象存在的,如果必须使用成员变量的时候就要使用对象方法。
alloc是给对象分配内存空间的时候使用。
init的作用是给变量等进行初始化。
4.MVC简介
MVC:模型视图控制器
M:model 模型 保存应用程序的数据
V : view 视图 显示视图
C:controller 控制器 在MVC(model-view-controller)设置模式中,充当模型与视图之间的 桥梁,负责将模型中的数据传到视图上进行显示。
MVC是一个框架模型,他强制性的使程序的输入,处理和输出分开。使用MVC应用程序被分成 三个核心部件:模型,视图,控制器。
5.线程与进程
进程:是指在系统中正在运行的一个程序
每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内
线程:1个进程要想执行任务,必须得有线程(每一个进程至少要有一条线程(主线程))。线程是进程的基本执行单元,程序的所有任务都在线程中执行。
线程类型:主线程 多线程
主线程:每个程序必须有主线程
主线程作用:显示、刷新UI界面 处理UI事件(比如点击事件,滚动事件,拖拽事件等)
多线程:一个程序开启多条线程,每条线程可以同时执行不同任务(如:下载图片数据)
多线程优点:能适当提高程序的执行效率,能适当提高资源利用率
多线程的缺点:1.开启线程需要占用一定的内存空间,如果开启大量的线程,会占用大量的内存空间,降低程序的性能。
2.程序设计更加复杂
6.缓存介绍
使用缓存的目的是为了使用的应用程序能更快速,使程序高效的运行,有时候我们需要将远程 web服务器的数据缓存起来,存放在沙盒的Documents文件夹中,减少对同一个网络数据的多次请求。
作用:提高效率 节省流量 提高用户体验
7.Autorelease pool
自动释放池,是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放
自动释放池本身销毁的时候,池子里面所有的对象都会做一次release操作
(1)在自动释放池中alloc一个对象后(如p1),仍然需要用[p1 autorelease];只是这个语句和[p1 release]不同,后者表示把p1的retainCount -1 ,而前者仅仅表示把p1放到自动释放池中返回一个self,自动释放池结束销毁时,统一对里面的对象引用计数 减一
(2)自动释放池可以随意创建,也可以嵌套使用
(3)不管这个对象是在自动释放池内还是外创建的,只要在自动释放池内写一个[p1 autorelease];p1就会被放到自动释放池中。注意autorelease是一个方法。且只有在自动释放池中使用才有效。
(4)如果把一个对象重复加到自动释放池中如[p1 autorelease];[p1 autorelease] 那么会出错。原因是:加载几次,届时自动释放池就会用[p1 release];释放几次。 但是由于这两个加载的对象其实是一个对象同样地址,所以第一次自动释放正确,第二次自动释放时发现已经被释放了,所以p1就成了野指针。
8.简述内存分区情况
(1)代码区:存放函数二进制代码
(2)数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放全局变量、静态变量、常量
(3)堆区:通过alloc等函数或者new等操作符动态申请得到,需程序员手动申请和释放。
(4)栈区:函数模块内申请,函数结束时由系统自动释放,存放局部变量,函数参数。
另一种说法:代码区,静态区,常量区,堆区、栈区
9.视图的声明周期
当一个视图控制器被创建,并在屏幕上显示的时候,代码的执行顺序
(1)alloc 创建对象,分配空间
(2)init 初始化对象,初始化数据
(3)loadView 从nib载入视图,通常这一步不需要去干涉。除非你没有使用xib文件创建视 图
(4)viewDidLoad 载入完成,可以进行自定义数据以及动态创建其他控件
(5)viewWillAppear 试图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了
(6)viewDidAppear 视图已在屏幕上渲染完成
当一个视图被移除屏幕并且销毁的时候的执行顺序,这个顺序差不多和上面的相反
(1)viewWillDisappear 试图将被从屏幕上移除之前执行
(2)viewDidDisappear 视图已经被从屏幕上移除,用户看不到这个是图了
(3)dealloc 试图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放
10、类别的作用和局限性
作用:(1)扩充现有类的功能
(2)扩充自定义类的功能,将自定义类的方法进行分类,使结构更加清晰,调用更加方便。
(3)声明非正式的协议
(4)匿名分类(@interface类名()@end),一般在依赖类的.m文件的最上面生成匿名分类,专门用来声明私有的属性和方法。
局限性:普通类别只是对类的方法的拓展,不能增加类的实例变量,类别拓展的方法名如果和类的方法相同,那么在调用该方法的时候,就会被类别方法覆盖,造成不能调用原类方法的目的,或者造成程序崩溃。
11、堆和栈的区别
对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来讲,释放工作有程序员控制,容易产生memory Leak(内存泄露)。
堆都是动态分配的,没有静态分配的堆。栈有两种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配是由alloc函数进行分配的,但是栈的动态分配和堆是不同的,他的动态分配由编译器进行释放,无需我们手工实现。
栈(操作系统)存放方法的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;堆存放创建的对象等动态数据。
12、什么是延迟加载(懒加载)?
懒加载即重写get 方法,此方法多用于已有的数据加载方法,加载数据后赋值给数组。
13、static静态变量的作用
(1)表示全局静态,用来修饰成员变量和成员方法。
(2)被修饰的变量和方法独立于该类的任何对象,即它不依赖类特定实例,被类的所有实例共享。
(3)静态方式可以直接通过类名调用,任何实力也可调用
(4)静态变量可以不进行外置声明,直接调用,使用静态方法,不用实例化,创建类的对象,使方法调用方便,节省空间。
(5)static成员是不能被其所在class创建的实例访问,其默认值是0,只要执行一次,运行时开辟全局内存空间,存储上一次数据,便于下一次调用,对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。
14、get和post使用时的区别
(1)get是从服务器上去获取数据,post事项服务器传输数据(一般是用于图片的传输)
(2)get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post 机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看到不到这个过程。
(3)对于get方式,服务器端用Request。QueryString获取变量的值,对于post方式,服务器端用Request。Form获取提交的数据。
(4)get传送的数据量小。post传送的数据量较大,一般被默认为不受限制。
(5)get安全性非常低,post安全性较高。但是get的执行效率却比post方法好。
建议:
(1)get方式的安全性较post方式要差些,包含机密信息的话,建议使用post数据提交方式。
(2)在做数据查询时,建议使用get方式,而在做数据添加,修改或删除时,建议用post方式。
15.数据请求的方法:
NSURLConnection 系统的,常用的方式
NSURLSession 系统的,IOS7.0之后出现,使用了block,提高了效率
ASIHttpRequest 第三方的,原来经常使用的数据请求库。缺点:环境是MRC,要进行ARC与MRC之间的转化,没有使用block
AFNetworking 第三方的,现在被经常使用,内部集成了NSURLConnection和NSURLSession,环境是ARC,使用了block,提高了开发效率,不用系统库的支撑。
16.@class和#import的区别
#import指令是Object-C针对#include的改进版本,#import确保引用的文件只会被引用一次,这样你就不会陷入递归包含的问题中。
(1)#import包含被引用类所有的信息,被引用类的变量和方法;@class是前向声明,只是告诉编译器在某一个类的.h文件中声明另外一个类,没有声明具体信息。
(2)使用@class只需要被引用类的名称,在.m文件使用#import来包含被引用类的头文件,因为实现类时需要用到被引用类的实例变量和方法。
17、frame和bounds的区别、contentSize、contentInset和contentOffset的区别
这几个都是在ios程序中,经常会注意到的一些小细节,能否真正了解这些,对写ios程序也有很大的好处。
首先,frame和bounds的区别
frame是UIView中表示此view的一个矩形面积,包括了view在它的superview中的一些几何上的标识。有起始坐标,也就是origin(CGPoint)和这个矩形面积的宽(width)和高(height)
bounds每个view,除了有对应它的superview的相关坐标外,它自己的几何坐标,所以bounds就是标识它自己做表关系的一个标识,它有和frame一样的属性,但在数值上会有有些不同。
center是一个view的中心,默认是这个view对应superview坐标的中间值。假如有个view-A,它是view-B的一个subview,view-A在view-B上的起始坐标是(40,40)(此坐标是view-B上的坐标),view-A的高(height)为380,宽(width)为240.所以,view-A的frame值是(160,230).所以,frame和bounds是有关联的,修改其中一个的宽或高,另一个也会相应的改变。
contentSize,contentInset和cotentOffset区别
contentSize 是scrollview中的一个属性,它代表scrollview中的可显示区域,假如有一个scrollview,它的frame为(0,0,320,480),而它的contentSize为(320,960)。也就是说,这个scrollview整个内容的大小为(320,960),要通过上下滑动scrollview来查看(320,480)后的内容.
contentOffset 是scrollview当前显示区域顶点相对于frame顶点的偏移量,比如上个例子你拉到最下面,contentOffset就是(0,-480),也就是y偏移了480
contentInset是scrollview中contentView.frame.origin与scrollview.frame.origin的关系,比如contentView的frame为(0,30,320,480),那么contentInset则为(0,30)
18、copy,retain,assign,readonly,readwrite,strong,weak,nonatomic整理
copy:建立一个索引计数为1的对象,然后释放旧对象,修饰NSString.在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。
retain:释放旧对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1,对其他NSObject和其子类。对参数进行release旧值,再retain新值。
copy其实是建立了一个相同的对象,而retain不是。retain是指针拷贝,copy是内容拷贝。
retain的set方法应该是浅复制,copy的set方法应该是深复制。
readonly 此标记说明属性是只读。
readwrite此标记说明属性会被当成读写。
nonatomic:非原子性访问,对属性赋值的时候,不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子性事务访问。
19、程序的生命周期
application didFinishLaunchingWithOptions:开始
applicationWillResignActive:变成不活跃
applicationDidEnterBackground:进入后台
applicationWillEnterForeground:进入前台
applicationDIdBecomeActive:变成活跃
applicationWillTerminate:即将关闭
20、bundle(沙盒):一个应用只能在自己的沙盒中读取或存储文件,而不能操作其他沙盒中的文件。好处:保护应用的隐私不受侵犯。保护系统文件的安排,应用删除后相关文件也能被全部清除。
每个应用都有自己的沙盒,沙盒的根目录的获取方法是NSHomeDirectory()。
根目录下的内容:
- .app文件,实际上是一个文件夹,包含了可执行文件,Nib文件,图片资源、plist等,Xcode中能看到的资源,及编译后的可执行文件,都封装在app中
-Documents文件夹,用于存放你的应用所产生的数据,该文件夹可以通过iTunes备份,可以存储游戏进度等
-Library文件夹,用于存放用户偏好和临时文件
-tmp文件夹是系统的中转站