一、笔试常用基础问题
1.#import 和 #include 的区别 @class?
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用 #import
2.@property的作用
@property是一个属性访问声明,支持重写set 和 get
3.readwrite,readonly,assign,retain,copy,nonatomic属性的作用
(1)readwrite 是可读可写特性;需要生成getter方法和setter方法时
(2)readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变
(3)assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
(4)retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
(5)copy 表示拷贝特性,setter方法将传入对象复制一份;需要完全一份新的变量时。
(6)nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic
4.在一个对象的方法里面:self.name=“object”;和name =”object”有什么不同吗?
self.name =”object”:会调用对象的setName()方法;
name = “object”:会直接把object赋值给当前对象的name属性。
5.请简述self.name= nil的机制,以及与[namerelease]的区别?
self.name =nil; //使用nil参数调用setName:方法
[name release]生成的访问器将自动释放以前的name对象
6.请简要说明viewDidLoad和viewDidUnload何时调用
viewDidLoad在view从nib文件初始化时调用,loadView在controller的view为nil时调用。此方法在编程实现view时调用,view控制器默认会注册memory warning notification,当view controller的任何view没有用的时候,viewDidUnload会被调用,在这里实现将retain的view release,如果是retain的IBOutlet view属性则不要在这里release,IBOutlet会负责release。
7.static的作用
(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,
因此其值在下次调用时仍维持上次的值;
(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明
它的模块内;
(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。
8.在Obj-c中有没有私有方法?私有变量?一般采用什么方法实现?
objective-c –类里面的方法只有两种,静态方法和实例方法.这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西.如果没有了私有方法的话,对于一些小范围的代码重用就不那么顺手了.在类里面声名一个私有方法
@interfaceController : NSObject {NSString *something; }
+(void)thisIsAStaticMethod;
-(void)thisIsAnInstanceMethod;
@end
@interfaceController (private)
-(void)thisIsAPrivateMethod;
@end
@private可以用来修饰私有变量
在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的
9.自动释放池是什么,如何工作
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。
(1). ojc-c是通过一种”referring
counting”(引用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0,就会被系统销毁.
(2). NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的.
(3). autorelease和release没什么区别,只是引用计数减一的时机不同而已,autorelease会在对象的使用真正结束的时候才做引用计数减一.
10.ViewController的loadView, viewDidLoad,viewDidUnload分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?
viewDidLoad在view从nib文件初始化时调用,loadView在controller的view为nil时调用。此方法在编程实现view时调用,view控制器默认会注册memory warning notification,当view controller的任何view没有用的时候,viewDidUnload会被调用,在这里实现将retain的view release,如果是retain的IBOutlet view属性则不要在这里release,IBOutlet会负责release。
11.浅复制和深复制的区别?//浅拷贝和深拷贝
浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。//通过对象的指针来访问这个对象
深层复制(mutableCopy):复制引用对象本身意思就是有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。//当修改A时,A copy不变。
12.frame和bounds有什么不同?
答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)//frame:框架、结构
bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)//bounds:界限
13.HTTP协议中,POST和GET的区别是什么?
(1).GET方法
GET方法提交数据不安全,数据置于请求行,客户端地址栏可见;
GET方法提交的数据大小有限
GET方法不可以设置书签
(2).POST方法
POST方法提交数据安全,数据置于消息主体内,客户端不可见
POST方法提交的数据大小没有限制
POST方法可以设置书签
14.关于多态性
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。
15.对于单例的理解
基本能用熟悉的语言写出一个单例,以及可以运用到的场景或是你编程中碰到过运用的此种模式的框架类等。进一步点,考虑下如何在多线程访问单例时的安全性。保证数据的唯一性,已经全局性,其内存是静态空间,随着程序的推出而释放。
Demo:
static Singleton* _instance = nil;
+ (instancetype) shareInstance
{
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init] ;
}) ;
return _instance;
}
16.Object-c的类可以多重继承么?可以实现多个接口么?重写一个类的方式用继承好还是分类好?为什么?
Objective-c 只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现, cocoa 中所有的类都是 NSObject 的子类,多继承在这里是用 protocol 委托代理来实现的。
17.线程与进程的区别和联系?
进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
18.讲述一下ios的mvc开发模式
答:m:model,数据处理; v : view,视图展示; c :controller,控制器(model与view之间的协调者)。
(1)Model和View永远不能相互通信,只能通过Controller传递。
(2)Controller可以直接与Model对话(读写调用Model),Model通过Notification和KVO机制与Controller间接通信。
(3)Controller可以直接与View对话,通过outlet,直接操作View,outlet直接对应到View中的控件,View通过action向Controller报告事件的发生(如用户Touch我了)。Controller是View的直接数据源(数据很可能是Controller从Model中取得并经过加工了)。Controller是View的代理(delegate),以同步View与Controller。
19.kvo与kvc
kvo 键值观察 kvc 键值编码
20.结构体和类的区别
(1)结构没有无参构造函数
(2)结构不能被继承
(3)结构是值类型,而类是引用类型
(4)结构在数据参数方面效率更高,简单数组的应用中成本很低
()类在方法运算方面更有优势,在抽象多级别时最佳选择
21.常见的object-c的数据类型有那些, 和C的基本数据类型有什么区别?如:NSInteger和int
object-c的数据类型有NSString,NSNumber,NSArray,NSMutableArray,NSData等等,这些都是class,创建后便是对象,而C语言的基本数据类型int,只是一定字节的内存空间,用于存放数值;NSInteger是基本数据类型,并不是NSNumber的子类,当然也不是NSObject的子类。NSInteger是基本数据类型Int或者Long的别名(NSInteger的定义typedef long NSInteger),它的区别在于,NSInteger会根据系统是32位还是64位来决定是本身是int还是Long。
22.简单介绍下NSURLConnection类及 + sendSynchronousRequest:returningResponse:error:与– initWithRequest:delegate:两个方法的区别?
答案:NSURLConnection主要用于网络访问,其中+ sendSynchronousRequest:returningResponse:error:是同步访问数据,即当前线程会阻塞,并等待request的返回的response,而– initWithRequest:delegate:使用的是异步加载,当其完成网络访问后,会通过delegate回到主线程,并其委托的对象。
二、技术面试题目
1、objective-c 是所有对象间的交互是如何实现的?
在对象间交互中每个对象承担的角色不同,但总的来说无非就是”数据的发送者”或”数据的接收者”两种角色,我们可以通过代理去进行通信,或者通过观察者消息模式,blocks,appdelegagte 通过:代理协议”或者”通知中心”方式的实现能最大限度的降低两交互对象之间的耦合,不错的设计;
2.GCD和NSOperation的区别
(1)、GCD是一种轻量级的方法来实现多线程。控制起来比较麻烦,比如取消和暂停一个线程。
(2)、NSOperation和NSOperationQueue相对于GCD效率上要低一点,他们是面向对象的方式,从Mac OS X v10.6和iOS4开始,NSOperation底层也是用的GCD来实现的。可以在多个操作中添加附属,也可以重用操作,取消或者暂停。NSOperation和KVO是兼容,也就是说,可以在NSOperation中使用KVO,例如,你可以通过NSNotificationCenter去让一个操作开始执行。
(3)、NSOperation的使用方法
【1】、继承NSOperation类
【2】、重写“main”方法
【3】、在“main”方法中创建一个autoreleasepool
【4】、将自己的代码放在autoreleasepool中
注意:创建自动释放池的原因是,你不能访问主线程的自动释放池,所以需要自己创建一个。
(4)、NSOperation的常用方法
【1】、start:开始方法,当把NSOperation添加到NSOperationQueue中去后,队列会在操作中调用start方法。
【2】、addDependency,removeDependency:添加从属性,删除从属性,比如说有线程a,b,如果操作a从属于b,那么a会等到b结束后才开始执行。
【3】、setQueuePriority:设置线程的优先级。例:[a setQueuePriority:NSOperationQueuePriorityVeryLow];一共有四个优先级:NSOperationQueuePriorityLow,NSOperationQueuePriorityNormal,NSOperationQueuePriorityHigh,NSOperationQueuePriorityVeryHigh。
当你添加一个操作到一个队列时,在对操作调用start之前,NSOperationQueue会浏览所有的操作,具有较高优先级的操作会优先执行,具有相同优先级的操作会按照添加到队列中顺序执行。
【4】、setCompletionBlock:设置回调方法,当操作结束后,会调用设置的回调block。这个block会在主线程中执行。
3、objective-c中是如何实现线程同步的?
Mutexlock(互斥锁)、NSCondition lock (条件锁)消息传送
4、什么是UDP和TCP的区别是什么?
TCP 的全称是传输控制协议,这种协议可以提供面向连接的、可靠的、点到点的通信。
UDP 的全称是用户数据包协议。他可以提供非连接的不可靠的点懂啊多点的通信,是osi参考模型中一种无连接的传输层协议,提供面向事务的简单的不可靠信息传输,_IETF RFC 768 是UDP 的正式规范;
选择何种协议,看程序注重那个方面,可靠抑或快速。
5、TCP/IP建立连接的过程?
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立连接;
第一次握手:建立连接时,客户端发送连接请求到服务器,并进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到客户端连接请求,向客户端发送允许连接应答,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的允许连接应答,向服务器发送确认,客户端和服务器进入通信状态,完成三次握手。
(所谓的三次握手,就是要有三次连接信息的发送、接收过程。TCP连的建立需要进行三次连接信息的发送、接收。)
6.动态绑定—在运行时确定要调用的方法
动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定 在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接 收者和被调用的方法。 运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点 确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C 代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时,
特别是当消息的接收者是动态类型已经确定的对象时,动态绑定就会例行而 透明地发生。
7.tableView 滑动卡的问题
从缓存中或者是从本地读取图片给UIImage的时候耗费的时间。需要把操作放到子线程里面。
8.子线程里面加入NSTimer 的时候需要 手动添加NSRunloop 否则不能循环。
9.在单例中创建数组应该注意些什么。
单利里面添加 NSMutableArray 的时候,防止多个地方对它同时便利和修改的话,需要加原子属性。并且用strong,,,并且写一个遍历和修改的方法。加上锁。 Lock UnLock
10.SDWebImage内部实现过程
(1)入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。
(2)进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给
(3)SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.
(4)先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
(5)SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。
(6)如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。
(7)根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。
(8)如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。
(9)如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。
(10)共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。
(11)图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。
(12)connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。
(13)connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。
(14)图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。
(15)在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。
(16)imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。
(17)通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。
(18)将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。
(19)SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
(20)SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。
(21)SDWebImagePrefetcher 可以预先下载图片,方便后续使用。
11.socket连接和http连接的区别
http连接:http连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉;
socket连接:socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。所以当一个socket连接中没有数据的传输,那么为了维持连接需要发送心跳消息~~具体心跳消息格式是开发者自己定义的
12.如何用原生代码实现断点下载和断点续传
断点续传原理每次上传是服务器返回进度标记,客户端根据进度获取相对应的data上传;断点下载:本地有两个文件夹,一个临时一个下载路径,每次下载获取数据时做一个标记,重新下载时配置http的请求头,再下载下对应位置的数据。
13.熟悉个别数据加密处理
MD5非对称加密 DES、AES对称性加密、RSA非对称加密。
三、冷门面试题目
1.请解释一下Handoff是什么,并简述它是如何实现iOS、Mac/网页应用互通的。
handoff是苹果在iOS8推出的一种不同设备直接的沟通软件,开启它之后,如果有用户在同个网络中收到某个电话,那么其iPad也会收到电话,假如现在你在使用iPad,那么你就不必再去寻找你的iPhone,用iPad就可以接听电话。
他是通过蓝牙,或wift之间来作为相互沟通的。
2.iOS扩展是指?能否列举一些热门或常见的范例?
扩展(Extension)是iOS 8中引入的一个非常重要的新特性。扩展让app之间的数据交互成为可能。用户可以在app中使用其他应用提供的功能,而无需离开当前的应用。
在iOS 8系统之前,每一个app在物理上都是彼此独立的,app之间不能互访彼此的私有数据。
而在引入扩展之后,其他app可以与扩展进行数据交换。基于安全和性能的考虑,每一个扩展运行在一个单独的进程中,它拥有自己的bundle, bundle后缀名是.appex。扩展bundle必须包含在一个普通应用的bundle的内部。
iOS 8系统有6个支持扩展的系统区域,分别是Today、Share、Action、Photo Editing、Storage Provider、Custom keyboard。支持扩展的系统区域也被称为扩展点。
3.请解释一下iOS应用沙盒机制。
iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒。所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。而且,
每个应用程序都有自己的存储空间
应用程序不能翻过自己的围墙去访问别的存储空间的内容
应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行
4.响应链(Responder Chain)是什么?它是如何发挥作用的?
响应链是什么,响应链是由响应者(Responder object)之间的touch消息传递以及检测组成,我们也可以理解为响应链是由响应者组成。
检测到hit-test View后,此view拥有优先处理事件的权利,如果view不能处理这个事件,事件就会沿着响应者链向下传递,直到找到一个能处理该事件的view.
响应链的起始点是,hit-test view(起点)和UIApplication对象(终点)。
网友评论