iOS面试知识点收集iOS Developer程序员

IOS面试题(三)

2017-04-15  本文已影响151人  upupSue

谈一谈GCD和NSOperation的区别?

NSOperation 相比于 GCD 有哪些优势?

谈谈多线程的应用

通常耗时的操作都放在子线程处理,然后到主线程更新UI,如

线程之间是如何通信的?

通过主线程和子线程切换的时候传递参数

performSelecter:onThread:withObject:waitUntilDone:

网络图片处理问题怎么解决图片重复下载问题?(SDWebImage大概实现原理)

这个就需要用到字典,以图片的下载地址url为key,下载操作为value,所有的图片大概分成三类:已经下载好的,正在下载的和将要下载的;

当一张图片将要进行下载操作的时候,先判断缓存中是否有相同的图片,如果有的话就返回,没有的话就根据url的md5加密值去沙盒中找,有的话就拿出来用,没有的话再去以图片的url为key去字典中找有没有正在进行的任务,最后去判断等待的下载操作任务里面的字典有无相同key,如果没有,就自己开启任务,记录一下,文件保存的名称是url的md5值

这里建立了两个字典 :
1.iconCache:保存缓存的图片
2.blockOperation 用来保存下载任务

每当进入或退出程序时,会进行图片文件的管理:超过一星期的文件会被清除,如果设置了最大缓存,超过这个缓存就会删除最旧的文件,直到当前缓存文件为最大缓存文件的一半大小;

一般app中大部分缓存都是图片的情况下,可以直接调用clear方法进行清除缓存,getSize()方法获取当前缓存大小。

多线程安全的几种解决方法?

1.只有在主线程刷新访问UI
2.如果要防止资源抢夺,需要用synchronize进行加锁保护
3.如果是异步操作要保证线程安全等问题,尽量使用GCD(有些函数默认就是安全的)
4.单例为什么用static dispatch_once?使用dispatch_once可以简化代码并且彻底保证线程安全,开发者无需担心加锁或同步。此外,dispatch_once更高效,它没有使用重量级的同步机制,若是那样做的话,每次运行代码前都要获取锁。

原子属性

代理的作用、block

谈谈你对runTime运行时机制的了解(注意哦,这个很重要的)

[objc_getClass("__NSArrayM") swizzleSelector:@selector(addObject:) withSwizzledSelector:@selector(hyb_safeAddObject:)];

使用场景:addObject方法添加的值为nil的时候会崩溃。调用objectAtIndex:时出现崩溃提示empty数组问题

谈谈你对Run Loop的理解

如何处理事件

应用

SQLite常用的SQL语句

创建表:create table 表名(字段名 字段数据类型 是否为主键, 字段名 字段数据类型, 字段名 字段数据类型...)
增:insert into 表名(字段1,字段2...) values(值1,值2...)
删:delete from 表名 where 字段=值

关于Socket,谈谈TCP/IP 和 UDP的理解

谈一谈内存管理

常见的数据持久化有哪些

//1.获得NSUserDefaults文件
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//2.向文件中写入内容
[userDefaults setObject:@"AAA" forKey:@"a"];
[userDefaults setBool:YES forKey:@"sex"];
[userDefaults setInteger:21 forKey:@"age"];
//2.1立即同步
[userDefaults synchronize];
//3.读取文件
NSString *name = [userDefaults objectForKey:@"a"];
BOOL sex = [userDefaults boolForKey:@"sex"];
NSInteger age = [userDefaults integerForKey:@"age"];
NSLog(@"%@, %d, %ld", name, sex, age);

这五种持久化操作不同点

KVC 和 KVO

@synthesize和@dynamic区别是什么

这两个关键字都是@property对应的词
@synthesize 语义是如果没有手动实现setter和getter方法,那么编译器会自动帮你加上这两个方法
@dynamic告诉编译器,属性的setter和getter由用户自己实现,不自动生成(readOnly只实现getter即可),但是如果没有自己实现,编译的时候不会报错,运行的时候就会报错,这就是所谓的动态绑定

什么是响应链,它是怎么工作的?

响应者对象以一个链的形式串联起来,当第一个响应者对象不能处理事件时,他将事件转发给下一个响应者对象。

post和get方式的区别

POST和PUT区别

深复制和浅复制

关于项目中动画的使用

为什么AFN显示图片不如SDWebImage流畅?同样是从网络上下载图片而不是从缓存取图片?

因为SDWebImage有一个decoder
UIImage的imageWithData函数是每次画图的时候才将Data解压成ARGB的图像
所以每次画图的时候,会有一个解压操作,这样效率很低,但是只有瞬时的内存需求
为了提高效率通过SDWebImageDecoder将包装在Data的资源解压,然后画在另外一张图片上,这样新的图片就不再需要重复解压了
这是典型的空间换时间的做法

上一篇 下一篇

猜你喜欢

热点阅读