1.请简述你对协议的理解请简述你对协议的理解?
答:1协议是一种语法,是用来实现代理这种机制;2协议单独使用时相当于一个类的扩展方法,但不同于类别,因为只要遵守协议的类都可以使用协议中的方法:3协议分为正式协议和非正式协议,默认为非正式协议。
2. 如何理解ARC自动引用计数机制?
答:iOS6之后出现的一种新的管理内存的方式。根据MRC中我们的内存管理规则,已经自动引用计数的规则编译器来帮我们进行内存的管理。ARC机制是编译期完成的机制,也就是说比如JAVA自动内存管理依靠的是JVM虚拟机,是在程序运行时实时进行内存垃圾的回收,而我们的ARC是编译期机制,是系统在变异时自动为我们的代码加入release、retain、dealloc等内存管理代码。
3. 如何理解retain/copy/assign/release/autorelease/dealloc关键字?
答:assign- 简单的赋值,不牵扯内存的操作。
retain – 使对象的的引用计数器+1,如果一个对象进行retain操作也就相当于一块内存上有两个指针的指向。(一个门有两把钥匙,retain是多了一把钥匙)。
copy-浅拷贝,
(一把钥匙两个门。一个指针指向两个地址)
release让对象的引用计数器-1相当于减少对象的持有数
autorelease-修饰的对象自动释放,在自动释放池中被修饰的对象会在自动释放池结束时会被release一次
dealloc-在对象的应用计数为1时(iOS5之前对象的引用计数可以被释放为0,但是iOS5之后引用计数最低位1)
在对象的应用计数为1时,再次对当前对象进行释放内存,则该对象会调用dealloc方法销毁内存。此时该对象订阅的通知时间器(计时器)(NSTimer)都会一并释放。
4.请简述self.name = xxx 与_name= xxx 的区别?
答:调用self.name相当于用属性,会执行对应的set方法或get方法;调用_name相当于调用成员变量是一个直接赋值的操作,区别在于如果直接调用set、get方法会是系统消耗效率而直接赋值不会,所以类使用还需要调用成员变量。
5. 请简述类别和继承有什么联系和区别?
答:联系:都是为了扩展类的功能;
区别:类别不可以扩展属性,类别中如果有函数和原本类中函数重名则会覆盖原有类中的函数,而继承则可以重写原有类中的方法。
6. 请简述你对strong和weak关键字的理解?
答:strong和weak都是ARC中用于修饰对象的关键词。Strong是强引用,用法类似与retain。Weak是弱引用,用法类似与assgin,但和assgin有一定的区别。
7. 请简述weak和assgin有什么区别?
答:从内存来讲weak和assgin没有任何区别都不会持有指针,但是如果一旦对象被释放,则assgin指向一块未知空间而weak会自动指向nil。
8. 如何实现ARC和MRC的混合编程?
答:在ARC项目中将非ARC的类加上-fno-objc-arc标注来实现混编。
9.Objective-c中是否支持多继承?
答:不支持多继承,可以通过协议实现多继承。
10. Objective-c中变量默认是私有的吗,方法默认是私有的 吗?
答:访问修饰符-public,protected,private
public-类外可以调用,可以被继承;
protected-类外不可以调用,可以被继承;
private-类外不可调用,不可以被继承;
变量如果是一个属性则是一个共有变量(.m文件中写的属性依旧是受保护变量),如果是一个成员变量则是一个受保护的,如果加了私有修饰符则变为私有。
函数在.m中声明的函数是受保护的函数,在.m的@interface中(private)中写的函数是私有函数在.h中声明的函数是公有函数。
答:如果需要重写get,set方法,且这个变量不想被类外调用时,我们会在@interface中写属性。
12. #import"".h和@class+类名的区别?
答:@class防止循环引用,效率比#import高。
13. 请简述页面传值都有哪些实现方式?
答:属性传值,代理传值,通知传值,block传值,kvc,kvo,NSUserDefault,单例,文件读写,初始化方法。
14. 系统中有哪些对象是单例?
答:NSApplication、NSFontManager、 NSDocumentController、 NSHelpManager、 NSNull、 NSProcessInfo、 NSUserDefaults、 NSNotificationCenter
15. 请简述深拷贝和浅拷贝的区别?
答:区别:浅拷贝是拷贝对象自身,深拷贝是拷贝对象自身和他的子对象。
简单的来说就是,在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存,而深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误
16.请简述你对MVC设计模式的理解?
答:mvc是开发中常用的一种设计模式,M代表数据类型,V代表视图,C代表控制器,控制器将M绑定在V上用于显示。这样做的好处是将不同的部分分开管理,用C来进行协议操作,降低程序的藕合性。
17. iOS中哪些技术符合观察者模式?
答:观察者模式就是对某一个变量或者函数进⾏行实时的检测,如果一旦发⽣生变化则我们去调⽤用对应的方法。
NSNotificationCenterKVO
18.请简述你对工厂方法的理解?
答:工厂方法输出27种设计模式种的一种,在这27种设计模式种还有一种叫做抽象工厂模式。所以工厂就是我们调用一个类方法告诉工厂我们需要的是什么样的对象,则方法就会返回给我们一个对应类型的对象,⾄于是如何实例化创建的该对 象我们都不需要去了解。
19. 什么是代理模式,实现代理需要注意什么?
答:代理模式就是B类需要实现A类的一个方法,且B类得不到A类的对象,则这时候我们使用代理,代理需要主动方和被动方的关系,且在引入头文件使会发生循环引用,还有通常我们不会使用双向代理。
20.请简述StoryBoard和Xib的联系和区别?
答:SB是Xib的集合,SB是iOS5出现的技术。
21.请简述UITableView对Cell的重用机制?
答;复用机制就是屏幕上最多显示,同标签cell有多少个我们就会实例化多少个cell,当cell试图偏移出tableView的frame时,cell会被放入cell复用池中等待,当有新的一⾏行出现时cell会被取出使用,用cell复用时需要注意:1.不同标签cell不能复用2. 优点是大大的节省了内存,被复用的cell有之前保的值,需要清空,3.每个tableView的cell复⽤用池是独⽴立 的即便屏幕上同时现在多个 tableView他们之前也不会复用cell。
22.如何使用UIScrollView实现无限加载多张图片?或UIScrollView如何实现复用机制?
答:依靠判断偏移量将ScrollView 中的视图放入到一个数组中备用。
23. UITableView有哪些优化方式?
答:1正确的复用cell。2 减少在返回每个cell里面的处理逻辑和处理时间。尽量将数据进行缓存和复用。3尽量减少处理加载和计算的时间,不阻塞UI线程。4尽量使用绘制每个cell。5设置每个cell的opaque属性。6尽量返回每行固定的height。7在每个cell减少图形效果。8分段加载数据。
24. 请简述视图控制器的生命周期?
25. 请简述iOS中的事件传递机制?
答:iOS事件路由机制。
26.UITableView有哪些必须要实现的数据源方法?
答:2个:一个设置分组中有多少行,设置UITableViewCell的返回。
27. iOS中frame和bounds的区别?
答:frame:是XYWH用4个值来确定控件的位置以及大小,bounds语意是边框的大小,也就是说,bounds只能得到WH两个值,并不能知道控件在什么位置。
28.介绍动画矩阵变换算法?
答:
29. CALayer的和UIView和绘图API的关系?
答:CALayer是层,每一个UIView都会有一个层在里面,层负责修改UIView的形状,阴影,颜色等操作。
30. 请简述Http协议中get请求和post请求的区别?
答:GET请求和POST请求都是HTTP协议中的方法.用来向服务器提交和请求数据.GET:显示请求,将参数拼接到地址栏中,只有请求头,参数大小不能超过1024k
POST:隐式请求,将参数添加到请求体中,相对安全,可以用来上传文件、图片等大小不能超过4G
31. 请简述你对异步请求数据的理解?
答:请求数据是一个耗时的过程,如果将它放在主线程中去执⾏行会卡住主界⾯面所以,我们会开启一个异步线程并将请求过程放在异步线程中执⾏行,这样一来我们就不会卡住主线程且可以同时执⾏行多个异步请求。
32. 什么是kvc/kvo 及它们之间有什么关系?
答:KVO就是Key-Value Observing建立在KVC之上,它能够观察一个对象的KVC key path 值的改变。
33. iOS中都有哪些技术可以实现开辟线程,它们的联系和区别是什么?
答:NSThread、NSOperationQueue、GCD,NSThread是OC自己封装的多线程操作方式,操作简单易懂,以线程为导向;NSOperationQueue也是OC自己封装的,很多三方库会选择用任务队列的方式,以任务为导向,并可以设置任务队列的并行数;GCD 效率最高,偏底层的API封装,也就是Block模式的NSOperationQueue同样是以任务为导向。GCD自动根据系统负载来增减线程数量,这就减少了上下文切换以及增加了计算效率。
34. NSThread中线程之间是如何实现通信的?
35. CGD中有哪些创建线程的方式?
36. iOS中有哪些技术可以保证线程安全?
37. ASIHttpRequest的父类是什么?