高级面试题

ISA

每一个对象内部都一个isa指针,对象的指针就指向他的真实类型,根据这个指针找到这个类

图片裁剪:

Core Graphics裁截三角形、矩形、圆形、以及这些图形,需创建画布,(自定义一个类继承自UIView,并重写子类的drawRect方法。)在这个方法中绘制图形。确定图形边框(path, drawRect)(Core Graphics其实是一套基于C的API框架,使用了Quartz作为绘图引擎)

coreAnimation:

CoreAnimation的动画执行过程都是在后台操作的,不会阻塞主线程。

继承结构:动画组,转场动画,基本动画,帧动画。

核心动画给我们展示的只是一个假象,layer的的frameboundsposition并不会在动画完毕之后发生改变。

•UIView封装的动画,会使会真实修改view的一些属性。

http://www.jianshu.com/p/ee2d3a8b2d67

autolayout:

做UI适配,不用考虑坐标

类和类扩展的区别(category,extension):

类只能扩充方法,类扩展能扩充属性和方法

socket:是一个网络传输协议,大文本传输只能用socket

框架AsyncSocket异步

TCP:传输协议,长链接。传输速度慢,不容易丢包,常用于聊天

UDP:传输协议,长链及。传输速度快,容易丢包,常用于网络游戏,局域网游戏

Http:超文本传输协议,短链接

客户端缓存机制:

缓存可以分为:内存数据缓存(先把数据放到内存中,程序退出,数据没有),数据库缓存,文件缓存

每次想获取数据的时候,先检测内存中有没有缓存数据,在检测本地有无缓存(数据库/文件),没有发送网络数据,将服务器返回的数据缓存

CoreData

1.coreData是SQLite的封装coreData是苹果自带的数据存储,sql语句是自己生成的,性能不好,会生成不必要的sql语句

2.NsManagedObject:实体对象(一个类对应一张表,一个对象对应表中的一条记录)

NSpersistentStoreCoordinator存储器,决定你的数据存储在什么地方

NSManagedObjectContext操作数据库(是个单例)

客户端安全性处理:

1.网络数据传输(登录的例子,加密,标示符)

敏感数据不能用明文发送

2.本地数据存储(加密)

3.源代码(混淆:把源代码搞乱)

手动混淆:类名,方法名等

工具混淆:

图片下载:

异步下载,多线程断点下载

AFNASI区别:

都是http请求框架

1.性能ASI最强,停止更新了,基于底层CFNetwork,AFN基于NSURL

2.AFN采取Block处理请求,ASI使用delegate

3.AFN服务器返回JSON,XML格式数据,ASI返回二进制

Run loop

1.每个线程都有runloop,主线程会自行创建并运run loop

2.Run loop处理事件有两种不同来源:input source输入源,timer source定时源

3.输入源传递异步消息,通常处理来自于其他线程或程序。定时源传递同步消息,处理UI界面的刷新,UI拖动,用户点击事件等

某一处卡顿解决

1.检查网络请求操作是否被放在主线程中;

2.看异步请求数量是否太多(子线程数量)

3.数据量是否太大(先清除看不见的数据,图片)

4.手机CPU使用率和内存问题

多线程实现,多线程安全控制

1.只在主线程刷新UI

2.防止资源抢夺

3.如果异步操作要保证线程安全等问题,尽量使用GCD(有些函数默认是安全的)

异步线程下载很多图片,失败解决:

1.重新下载

2.下载完毕后,利用RunLoop的输入源回到主线程刷新

runtime

基于c语言,是OC的底层,每写一句都会转成runtime,能动态增删修改一个类,一个成员变量,一个方法。

性能优化:

从用户体验出发:1、程序loading不要太长、2、相同数据不做重复获取、3、昂贵资源要重用(cell、sqlite、date),4、良好的编程习惯和程序设计:选择正确的集合对象和算法来进行编程、选择适合的数据存储格式(plist、SQLite)、优化SQLite查询语句5、数据资源方面的优化(缓存和异步加载)

多线程:http://www.jianshu.com/p/0b0d9b1f1f19

1.NSThread:经苹果封装后,完全面向对象。可以直接操控线程,但生命周期需手动管理。它还不够智能,不能优雅地处理多线程中的其他高级概念。

//创建

NSThread*thread = [[NSThreadalloc] initWithTarget:selfselector:@selector(run:) object:nil];

//启动

[thread start];

2.GCD会自动合理利用更多cpu内核,自动管理线程的生命周期(创建,调度任务,销毁),使用的是C语言,使用了大量block。

1).任务:两种执行方式

同步执行和异步执行区别在于会不会阻塞当前线程;

同步:会阻塞当前线程并等待block中任务执行完成,然后继续往下运行;

异步:线程之间不影响;

2).队列:

串行:先进先出,一个一个执行;

并行:开很多线程,一起执行,但任务过多,也不会让所有的人物同时执行。

3.NSOperation和NSOperationQueue:NSOperation是苹果对GCD的封装,完全面向对象。操作步骤:

1).将要执行的任务封装到一个NSOperation对象中。

2).将此任务添加到一个NSPOrerationgQueue对象中。

TCPUDP

1.TCP工作原理

TCP的连接建立过程又称为TCP三次握手:

首先发送方主机向接收方主机发起一个建立连接的同步(SYN)请求;

接收方主机在收到这个请求后向发送方主机回复一个同步/确认(SYN/ACK)应答;

发送方主机收到此包后再向接收方主机发送一个确认(ACK),此时TCP连接成功建立.

一旦初始的三次握手完成,在发送和接收主机之间将按顺序发送和确认段。关闭连接之前,TCP使用类似的握手过程验证两个主机是否都完成发送和接收全部数据。

完成三次握手,客户端与服务器开始传送数据。

TCP工作过程比较复杂,包括的内容如下:

TCP连接关闭:发送方主机和目的主机建立TCP连接并完成数据传输后,会发送一个将结束标记置1的数据包,以关闭这个TCP连接,并同时释放该连接占用的缓冲区空间。

TCP重置:TCP允许在传输的过程中突然中断连接。

TCP数据排序和确认*:在传输的过程中使用序列号和确认号来跟踪数据的接收情况。

TCP重传:在TCP的传输过程中,如果在重传超时时间内没有收到接收方主机对某数据包的确认回复,发送方主机就认为此数据包丢失,并再次发送这个数据包给接收方。

TCP延迟确认:TCP并不总是在接收到数据后立即对其进行确认,它允许主机在接收数据的同时发送自己的确认信息给对方。

TCP数据保护(校验):TCP是可靠传输的协议,它提供校验和计算来实现数据在传输过程中的完整性。

autorelease的对象何时被释放:

如果了解一点点Run Loop的知道,应该了解到:Run Loop在每个事件循环结束后会去自动释放池将所有自动释放对象的引用计数减一,若引用计数变成了0,则会将对象真正销毁掉,回收内存。

所以,autorelease的对象是在每个事件循环结束后,自动释放池才会对所有自动释放的对象的引用计数减一,若引用计数变成了0,则释放对象,回收内存。因此,若想要早一点释放掉auto release对象,那么我们可以在对象外加一个自动释放池。比如,在循环处理数据时,临时变量要快速释放,就应该采用这种方式:

for(inti=0;i<10000000;++i){

@autoreleasepool{

HYBTestModel*tempModel=[[HYBTestModelalloc]init];

//临时处理

// ...

}//出了这里,就会去遍历该自动释放池了

推荐阅读更多精彩内容

  • iOS面试题目100道 1.线程和进程的区别。 进程是系统进行资源分配和调度的一个独立单位,线程是进程的一个实体,...
    有度YouDo阅读 27,391评论 8 135
  • 我就是魏蓓蓓阅读 100评论 0 0
  • 雨后,晕开几缕浮云 浅浅弥漫水汽氤氲 心情 被叶落占据 旋转 纷飞 零散了一地光晕 闭眼 倾听 风得到阳光的应允 ...
    乁乁阅读 105评论 0 1