一些常见iOS面试常见的问题(一)



虽然已工作很长时间了,但是看到一些题,我还是会想起那些面试的时光,下面是一些面试的常见题型


1、为什么UIScrollView的滚动会导致NSTimer失效?

应该是因为UIScrollView滚动的时候跟主线程不是同一个runloop mode,一个runloop mode就是input sources、timer和observers的集合。每次执行runloop,都需要指定一个mode。UIScrollView滚动时候由于不同的mode所以也导致它只能保证它所在的runloop的timer有效,而主线程无效。

  相关文章 http://v.youku.com/v_show/id_XODgxODkzODI0.html  优酷的视频,还是挺好的

 什么是 Runloop?

是一个与线程相关的机制,可以理解为一个循环,在这个循环里面等待事件然后处理事件.而这个循环是基于线程的,在Cocoa中每个线程都有它的runroop,通过他这样的机制,线程可以在没有事件要处理的时候休息,有事件运行,减轻CPU压力,这题可以衍生出为什么在滑动时会导致定时器失败

定时器里面有个runoop mode,一般定时器是运行在defaultmode上但是如果滑动了这个页面,主线程runloop会转到UITrackingRunLoopMode中,这时候就不能处理定时器了,造成定时器失效,原因就是runroop mode选错了,解决办法有2个,一个是更改mode为NSRunLoopCommonModes(无论runloop运行在哪个mode,都能运行),还有种办法是切换到主线程来更新UI界面的刷新


 2、为什么当 Core Animation 完成时,layer 又会恢复到原先的状态?


因为这些产生的动画只是假象,并没有对layer进行改变.那么为什么会这样呢,这里要讲一下图层树里的呈现树.呈现树实际上是模型图层的复制,但是它的属性值表示了当前外观效果,动画的过程实际上只是修改了呈现树,并没有对图层的属性进行改变,所以在动画结束以后图层会恢复到原先状态


3,你会如何存储用户的一些敏感信息,如登录的 token。

 
使用keychain来存储,也就是钥匙串,使用keychain需要导入 Security框架
最简单的方法就是导入keychain,相对安全一点,也仅仅是相对安全



7、NSNotification 和 KVO 的使用场景?

  • KVO使用场景:当一个对象的特定属性改变的时候,需要被通知一个或者多个对象的时候
  • NSNotification使用场景:跨层级传递值,多个对象通知多个对象

 8、使用 Block 时需要注意哪些问题?


  • 在block内部使用外部指针且会造成循环引用情况下,需要用__weak修饰外部指针
    __weak typeof(self) weakSelf = self;
  • 在block内部如果调用了延时函数还使用弱指针会取不到该指针,因为已经被销毁了,需要在block内部再将弱指针重新强引用一下__strong typeof(self) strongSelf = weakSelf;
  • 如果需要在block内部改变外部变量的话,需要在用__block修饰外部变量

9、performSelector:withObject:afterDelay:内部大概是怎么实现的,有什么注意事项么?


  • 创建一个定时器,时间结束后系统会使用runtime通过方法名称(Selector本质就是方法名称)去方法列表中找到对应的方法实现并调用方法
  • 注意事项
    • 调用performSelector:withObject:afterDelay:方法时,先判断希望调用的方法是否存在respondsToSelector:
    • 这个方法是异步方法,必须在主线程调用,在子线程调用永远不会调用到想调用的方法

 
11、使用NSUserDefaults时,如何处理布尔的默认值?
(比如返回 NO,不知道是真的 NO 还是没有设置过)


  • 把 Data Source 和其他 Protocols 分离出来(将UITableView或者UICollectionView的代码提取出来放在其他类中)
  • 将业务逻辑移到 Model 中(和模型有关的逻辑全部在model中写)
  • 把网络请求逻辑移到 Model 层(网络请求依靠模型)
  • 把 View 代码移到 View 层(自定义View)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值