iOS面试题汇总3

一.在iPhone应用中如何保存数据
1.通过web服务,保存在服务器上
2.通过NSCoder固化机制,将对象保存在文件中
3.通过SQlite或CoreData保存在文件数据库中

二.什么是coredata
coredata框架是apple提供的一套通用自动的解决方案,包括了对象生存周期,对象关系图,持久话化制

三.什么是NSManagedobjectContext
NSManagedbjectContext对象负责应用和数据库之间的交互。

四.coredata有哪几种持久话存储机制
1.XML(iOS系统不支持) 2. 自动存储 3.SQLite,4.内存存储

五.BOOL和bool的区别
OC中的BOOL值是一种对带符号的字符类型的类型定义,通过#define指令把YES定义为1,NO定位0;
1.类型不同:BOOL为int型,bool为布尔型
2.长度不同:bool只有一个字节,BOOL长度视实际环境来决定,一般可认为是4个字节
3.取值不同:bool取得是false和ture是0和1的区别,BOOL取得是FALSE和TURE是0和非0的区别。

六.请解释一下keywords的区别:assign vs weak,__block vs __weak
1.assign适用于基本数据类型,weak适用于NSObject对象,并且是一个弱引用。
assign可以用来修饰对象,但是assign修饰的对象在释放之后指针的地址为nil,如果在后续的内存分配中刚好分配到这块地址,系统就会奔扩。而weak修饰的对象在释放之后,指针地址会被置为nil。所以一般弱引用用weak.
2.__block是用来修饰一个变量,这个变量可以在block中被修改,
__block:使用__block修饰的变量会在block代码块中被retain(ARC,MVC下不会)
__weak:使用__weak修饰的变量不会在block代码块中被retain
同时在ARC下,要避免block出现循环引用__weak typedof(self)weakSelf = self

七.__block在ARC和非ARC下含义是一样的么
__block在ARC下捕获的变量会被block retain,这样会导致循环引用,所以必须要使用弱引用__weak才可以解决问题,在非ARC下,可以直接使用__block说明符修饰变量,因为在非ARC下,block不会被retain.

八.使用nonatomic一定是线程安全的吗?
不是,nonatomic的内存管理是非原子的,系统不会为setter方法加锁,非线程安全,适合内存较小的移动设备。
atomic原子操作,系统会为setter方法加锁,线程安全,需要消耗大量的系统资源来为属性加锁。
所以atomic是线程安全的,nonatomic是线程不安全的,如果只是单线程操作的话,用nonatomic最好。

九.+(void)load;和+(void)initialize有什么用处?
在OC中,runtime会自动调用每个类的两个方法。+load会在类初始加载时调用,+
initialize会在第一次调用类的方法或者实例方法之前被调用,这两个方法是可选的,且只有在实现了它们时才会被调用。共同点:两个方法都只会被调用一次。

十.为什么其他语言里叫函数调用, objective c里则是给对象发消息(或者谈下对runtime的理解)
其他语言如C,JAVA,C++中提到的函数调用或者方法调用,是在编译期九已经决定了会调用那个函数,编译器在编译期就能检查出函数的执行是否正确。
而OC是一门动态的语言,是尽可能将所有工作推迟到运行时才决定他是基于runtime来工作,runtime的核心就是消息发送。
runtime:所有消息都会在运行的时候才确定,[obj message]在运行时会被转化为objc_msgSend(id self,Sel cmd,...)来执行,它会在运行时从选择子表中寻找对应的选择子(@selectr)并将其于现实进行绑定。
runtime几乎可以修改OC中的一切:class property objec ticar method protocol。
主要应用1.内省 2.为分类动态添加属性 3.使用方法调剂修改原有方法实现

十一.UIView和CALayer有什么关系
每一个UIView都对应一个Core Animation框架中的CALayer,在iOS上处理UIView实际上就是在操作CALayer.UIView是对CALayer的轻量级的封装。UIView继承自UIResponder处理来自用户的事件,CALyer继承自NSObject主要用于图层的渲染和动画。

十二.如何高性能的给UIImageView加个圆角。
给UIImageView或者说 UIKit的控件天假圆角都是改变clipsToBounds和layer.cornerRadius会强制Core Animation提前渲染屏幕的离屏绘制,给性能带来负面影响,所以使用贝塞尔曲线。eg:
UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,100,100)];
imageView.center = CGPointMake(200,300);
UIImage * anotherImage = [UIImage imageName:@"image"];
UIGraohicsBeginImageContextWithOptions(imageView.bounds.sie,NO,1.0);
[[UIBezierPath bezierPathWithRoundedRect:imageView.boundscornerRadius:50]addClip];
[anotherImage drawInRect:imageView.bounds];
imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraohicsEndImageContext();
[self.view addSubview:imageView];

十三.hettp的POST和GET方法有什么区别
GET类型的请求是幂等的,而POST请求是有副作用的,GET用于获取一些资源而POST

推荐阅读更多精彩内容