iOS面试题

来源:互联网 发布:js怎么遍历对象数组 编辑:程序博客网 时间:2024/06/05 15:34
前言:总结了一些比较经典的iOS面试题,和找工作的你共同进步互勉(其实看这些面试题,也是对自己知识掌握程度的一个判断,一个查漏补缺的过程,只要技术掌握号了,不愁找不到工作)
查看目录:
1. 描述下SDWebImage里面给UIImageView加载图片的逻辑2. 请简述UITableView的复用机制3. 控制器的生命周期4. 你是怎么封装一个view的5. 如何进行iOS6、7的适配6. 用过Core Data 或者 SQLite吗?读写是分线程的吗?遇到过死锁没?如何解决的?7. iOS 怎么存储数据8. 项目上线的流程是什么9. 说几个常见的SQlite语句把,比如说增删查改10. 沙盒里面都有什么,具体一点11. 推送通知分为两种,一个是本地推送,一个是远程推送12. 为什么 UIScrollView 的滚动会导致 NSTimer 失效?13. 为什么要学习编程,编程对你而言的乐趣在哪儿?14. 简述类目category优点和缺点15. 默认的引用方式是强引用,但上面说了有时我们还得使用弱引用,那是什么情况呢? 16. **#include与**#import的区别、**#import **与@class 的区别17. 堆和栈的区别18. iOS 界面卡顿原因19. iOS面试题目二20. iOS面试题目一21. UITableView优化技巧
NO.1 描述下SDWebImage里面给UIImageView加载图片的逻辑
- SDWebImage 中为 UIImageView 提供了一个分类UIImageView+WebCache.h, 这个分类中有一个最常用的接口sd_setImageWithURL:placeholderImage:,会在真实图片出现前会先显示占位图片,当真实图片被加载出来后在替换占位图片- 加载图片的过程大致如下:    - 首先会在 SDWebImageCache 中寻找图片是否有对应的缓存, 它会以url 作为数据的索引先在内存中寻找是否有对应的缓存    - 如果缓存未找到就会利用通过MD5处理过的key来继续在磁盘中查询对应的数据, 如果找到了, 就会把磁盘中的数据加载到内存中,并将图片显示出来    - 如果在内存和磁盘缓存中都没有找到,就会向远程服务器发送请求,开始下载图片    - 下载后的图片会加入缓存中,并写入磁盘中    - 整个获取图片的过程都是在子线程中执行,获取到图片后回到主线程将图片显示出来
NO.2 请简述UITableView的复用机制
- 每次创建cell的时候通过dequeueReusableCellWithIdentifier:方法创建cell,它先到缓存池中找指定标识的cell,如果没有就直接返回nil- 如果没有找到指定标识的cell,那么会通过initWithStyle:reuseIdentifier:创建一个cell- 当cell离开界面就会被放到缓存池中,以供下次复用
NO.3 控制器的生命周期
#就是问的view的生命周期,下面已经按方法执行顺序进行了排序// 自定义控制器view,这个方法只有实现了才会执行- (void)loadView{    self.view = [[UIView alloc] init];    self.view.backgroundColor = [UIColor orangeColor];}// view是懒加载,只要view加载完毕就调用这个方法- (void)viewDidLoad{    [super viewDidLoad];    NSLog(@"%s",__func__);}// view即将显示- (void)viewWillAppear:(BOOL)animated{    [super viewWillAppear:animated];    NSLog(@"%s",__func__);}// view即将开始布局子控件- (void)viewWillLayoutSubviews{    [super viewWillLayoutSubviews];    NSLog(@"%s",__func__);}// view已经完成子控件的布局- (void)viewDidLayoutSubviews{    [super viewDidLayoutSubviews];    NSLog(@"%s",__func__);}// view已经出现- (void)viewDidAppear:(BOOL)animated{    [super viewDidAppear:animated];    NSLog(@"%s",__func__);}// view即将消失- (void)viewWillDisappear:(BOOL)animated{    [super viewWillDisappear:animated];    NSLog(@"%s",__func__);}// view已经消失- (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; NSLog(@"%s",__func__); } // 收到内存警告- (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; NSLog(@"%s",__func__); }// 方法已过期,即将销毁view- (void)viewWillUnload { } // 方法已过期,已经销毁view- (void)viewDidUnload {}
NO.4 你是怎么封装一个view的
可以通过纯代码或者xib的方式来封装子控件建立一个跟view相关的模型,然后将模型数据传给view,通过模型上的数据给view的子控件赋值/** * 纯代码初始化控件时一定会走这个方法 */- (instancetype)initWithFrame:(CGRect)frame{          if(self = [super initWithFrame:frame]) {         [self setup]; }       return self;}/** * 通过xib初始化控件时一定会走这个方法 */- (id)initWithCoder:(NSCoder *)aDecoder{        if(self = [super initWithCoder:aDecoder]) {      [self setup]; }     return self;}- (void)setup{ // 初始化代码}
NO.5 如何进行iOS6、7的适配
通过判断版本来控制,来执行响应的代码功能适配:保证同一个功能在67上都能用UI适配:保证各自的显示风格// iOS版本为7.0以上(包含7.0)#define iOS7 ([[UIDevice currentDevice].systemVersion doubleValue]>=7.0)
NO.6 用过Core Data 或者 SQLite吗?读写是分线程的吗?遇到过死锁没?如何解决的?
- 用过SQLite,使用FMDB框架- 丢给FMDatabaseQueue 或者 添加互斥锁(NSLock/@synchronized(锁对象))
NO.7 iOS 怎么存储数据

iOS 数据存储的常用方式

NO.8 项目上线的流程是什么

iOS APP上架流程

NO.9 说几个常见的SQlite语句把,比如说增删查改

SQLite 初学

NO.10 沙盒里面都有什么,具体一点

iOS沙盒机制介绍

NO.11 推送通知分为两种,一个是本地推送,一个是远程推送
本地推送:不需要联网也可以推送,是开发人员在APP内设定特定的时间来提醒用户干什么远程推送:需要联网,用户的设备会于苹果APNS服务器形成一个长连接,用户设备会发送uuid和Bundle idenidentifier给苹果服务器,苹果服务器会加密生成一个deviceToken给用户设备,然后设备会将deviceToken发送给APP的服务器,服务器会将deviceToken存进他们的数据库,这时候如果有人发送消息给我,服务器端就会去查询我的deviceToken,然后将deviceToken和要发送的信息发送给苹果服务器,苹果服务器通过deviceToken找到我的设备并将消息推送到我的设备上,这里还有个情况是如果APP在线,那么APP服务器会于APP产生一个长连接,这时候APPF服务器会直接通过deviceToken将消息推送到设备上
NO.12 为什么 UIScrollView 的滚动会导致 NSTimer 失效?
  • 定时器里面有个runoop mode,一般定时器是运行在defaultmode上但是如果滑动了这个页面,主线程runloop会转到UITrackingRunLoopMode中,这时候就不能处理定时器了,造成定时器失效,原因就是runroop mode选错了,解决办法有2个,一个是更改mode为NSRunLoopCommonModes(无论runloop运行在哪个mode,都能运行),还有种办法是切换到主线程来更新UI界面的刷新
NO.13 为什么要学习编程,编程对你而言的乐趣在哪儿?
  • 这个问题面试官想考察的是你对编程的认知是什么,编程对于你而言是什么,你对编程的态度如何,你是否是对这个编程有浓厚的兴趣而不是纯粹的只是因为这行赚钱多才做这行
  • 参考答案:为什么学习编程这边可以介绍下你是如何进入这行的,乐趣对于我而言有以下几点吧.
    • 看着代码一行行从指下敲出,然后慢慢构建成一个完整的APP的那种愉悦感.
    • 花费长时间去解决一个BUG,当最终解决掉这个BUG后那种酣畅淋漓的感觉.
    • 有人问你问题,然后你帮忙解决以后,那种满足的感觉.
    • 你可以和懂技术的人聊天,就像大学时候大家一起聊LOL一样
NO.14 简述类目category优点和缺点
优点:
  • 不需要通过增加子类而增加现有类的行为(方法),且类目中的方法与原始类方法基本没有区别;
  • 通过类目可以将庞大一个类的方法进行划分,从而便于代码的日后的维护、更新以及提高代码的阅读性;
缺点:
  • 无法向类目添加实例变量,如果需要添加实例变量,只能通过定义子类的方式;
  • 类目中的方法与原始类以及父类方法相比具有更高优先级,如果覆盖父类的方法,可能导致super消息的断裂。因此,最好不要覆盖原始类中的方法。
NO.15 默认的引用方式是强引用,但上面说了有时我们还得使用弱引用,那是什么情况呢?
  • 强引用循环:A对象强引用了B对象,B对象也强引用了A。因为都是强引用,也就是无论是A是B都要在对方的引用断了后才能销毁,但要断了引用,就必须对方对象销毁。就会出现这种僵局,为了避免出现这种情况,就应该有一个对象“示弱”,使其为“弱引用”。
NO.16 #include与#import的区别、#import 与@class 的区别
  • include 和#import其效果相同,都是查询类中定义的行为(方法);
  • import不会引起交叉编译,确保头文件只会被导入一次;
  • @class 的表明,只定 义了类的名称,而具体类的行为是未知的,一般用于.h 文件;
  • @class 比#import 编译效率更高。
  • 此外@class 和#import 的主要区别在于解决引用死锁的问题。
NO.17 堆和栈的区别
  • 栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值, 局部变量的值等,栈是向低地址扩展的数据结构,是一块连续的内存的区域。即栈顶的地址和栈的最大容量是系统预先规定好的。
  • 堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时由OS回收,向高地址扩展的数据结构,是不连续的内存区域,从而堆获得的空间比较灵活。
  • 碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出.
  • 分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
  • 分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
    全局区(静态区)(static),全局变量和静态变量的存储是放在一块 的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。
  • 文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
  • 程序代码区—存放函数体的二进制代码
NO.18 iOS 界面卡顿原因

iOS 界面卡顿原因

NO.19 iOS面试题目二

iOS面试题目二

NO.20 iOS面试题目一

iOS面试题目一

NO.21 UITableView优化技巧

UITableView优化技巧

0 0
原创粉丝点击