iOS面试题


1\简述下 ios8 新增的新特性?
例如:我觉得iOS8的新特性主要是朝大数据与健康方向发展,个人感觉这两个方向也是未来发展的趋势.
就好比在iOS8中增加的HealthKit健康应用,并且还让苹果设备与第三方软件共享数据.还有就是新增的icloud Driver云盘,它实现了苹果设备与其他设备之间的文件共享.未来是大数据和健康两个主题的时代,如今已经不再是满足用户的便捷办公,这么简单了.不像10年苹果刚刚火起来的时候,而现在更多的需要关注到用户的便携和健康.

2\简述ARC的机制原理
 ARC与java中的垃圾回收机制不一样,它的实质其实就是自动帮我们在需要释放OC对象的地方,加上release或者autorelease,前期的iOS开发是比较痛苦的,大部分精力都是花在内存的管理上,至从ARC出来之后大大的减少了iOS程序的压力.
ARC的原理是在编译的时候为每个对象加入适合的代码,保证这些对象合理的生命周期.ARC通过增加retain,release和autorelease等函数,使得在维护引用计数器方便到达和手动管理内存同样的效果.当引用计数器为0的时候对象会被释放掉.
在来说说MRC,在MRC中我们需要遵循一种比较牛逼的法则:黄金法则,只要见到retain copy alloc new 等函数的时候,都需要有release或者autorelease与其对应.
我们在来说说自动释放池,在ARC前期我们使用的时候自动释放池来管理内存的,在自动释放池中只要使用autorelease函数的对象,都会在自动释放池被销毁的时候调用一次release操作.
我们再来说说比较底层的东西,在创建对象系统会在对象上创建一个isa指针,也是正因为这个指针我们才能找到对象上的方法和属性.这个是我在一本书上看见的,书名叫做Object-c高级编程 多线程和内存管理.内部还有很多东西有些遗忘了.这些就是我知道的内存管理的东西.

3\ 简单编写一个 block
 int(^)(int  ,int)sum = ^(int a,int b){
     return a+b;
}
block的组成:返回值类型(^block名称)(参数类型列表)=^(参数列表){保存的代码块}
block名称(参数列表);
在来说说block的作用
block主要使用来保持数据,并且在逆向传参的时候经常使用.
在进行网络请求封装的时候时候,block是不二的选择.再来说说为啥在逆向传参的时候为啥不选择代理.代理的能尽量少用,最好尽量少用,因为代理消耗性能比较大.然而block相对来说是轻量级,砍掉了代理中的什么实现协议,什么实现代理的方法.并且block的使用相对较为简单.并且block可以作为参数和方法来用.在封装网络请求的时候,我们使用的就是block作为参数.从而解放了控制器.
 

4\ 怎么解决ios7ios8中横竖屏的问题?
     iOS7与iOS8已经没有横竖屏的问题了.
     横竖屏问题是发生在iOS5与iOS6上,解决的办法:在info.plist文件的support interface orientations中加入所有的方向支持.然后在AppDelegate中加入supportedInterfaceOrentationsForWindonw方法,然后在你像控制旋转的界面中加入三方方法,supportedInterfaceOrientations,shouldAutorotate,shouldAutorotatoToInterfaceOrentation浙商个方法.这样就解决了APP同时支持iOS5和iOS6系统的横竖切换了.
不过现在我们抛弃了6系统了,7系统的人也在减少.5系统就更不要说了.


5\MVC 是什么?有什么特性?为什么在 iphone 上被广泛运用?
     MVC是一种开发模式,它的分别有种东西组成,分别是视图模型控制器,其实在java的开发中MVC也是被广泛使用的,因为它不仅让整个项目方便管理,也从而降低了程序的耦合性.分层结构的思想,是我们开发程序的不二选择.即方便我们开发,同时也分工明确.每一层都完成各自的任务,V代表视图,它的主要职责是展现数据,而M是模型它的主要功能是为V提供展示的数据,也可以说它是一个断咱的仓库,但是它的职责就是保存对象.这也是为什么我们在开发中要创建对象模型.C代表控制器,它的职责出来是处理业务,它主要与V打交道把要现实的数据给V.早期我们在开发的时候,没有MVC开发模式的时候,所有的代码都拥挤在一起,这让我们维护和差错程序的时候变得异常的艰难.

6\ 委托是什么?委托的 property 声明用什么属性?为什么?
     委托其实就是一个方法,一个写在协议里面的方法.
     来说说委托的实质:一个自己做不了的事,让别人去做.
     记得有个经典的例子,租房例子,A想要租房,但是A没有时间,于是A找到B,B是中介,B按照A的要求去找到C.B说白了就是委托的对象.委托的property声明用weak属性,主要是防止循环引用的问题.
     这里来谈谈循环引用的问题,循环引用的实质其实就是强指针制作成的一个循环的链条,我们都知道强指针指向的对象不能够被释放.这样就会造成内存泄露.而使用weak就相当于把循环的链条简断成一条有两个点的链条.这样就能够解决循环引用的问题了. 

7\ 项目使用过哪些第三方库?
     AFN\GCDSocket\masonary\MJExtension\MJRefresh\其中还有自己写的keyBoard框架\MBProgessHud\SSKeyChain\GDom\RHAddress\MJPhoteBrowser\ SDWebImage框架 等框架很多.

AFN框架主要是用来处理网络请求,它封装session和connection两种请求.因为connection使用起来简答,但是只能做一些简单的网络请求,而session正好弥补了这一点.
 
GCDSocket框架主要是用来做网络传输数据的,在客服端需要使用到端口号,服务段的IP地址,只要有了这两样东西,就可以进行TCP传输.当然这个框架还可以进行UDP传输.不过我只坐过简单的TCP传输程序.
 
来谈谈TCP与UDP的区别,一个TCP的传输过程需要进过三个步骤:1\客服端请求传输数据2\服务端接受传输数据3\客服端传输数据.因此TCP传输的数据真实性较高.
而UDP则是,直接可服务端传输数据,并不会请求,但是传输速度快,比如QQ|微信等聊天软件都是使用UDP进行传输的.

MJExtension框架则是把字典转换为模型,把模型转换字典.方便我们写那些垃圾代码.直接一行代码(objectXXX)就可以搞定了.

MJRefresh框架则是制作tableView下拉刷新和上拉刷新的框架.使用非常简单,只需要导入框架遵守协议,实现调用头尾方法就好了自己写的.

keyboard框架主要使用来处理textfield与textField之间的焦点跳转,并且在键盘上自定义了自己需要的按钮.

MBProgressHud框架主要使用来作提醒业务的,使用也特别简单直接导入框架不过最好把导入的代码写在pch文件中,方便之后使用,不过需要注意的地方就是用show,就一定有hid.还要注意的地方就是在使用的时候注意各个view的层级关系.

SSKeyChain框架,主要使用保存钥匙串的.这个框架使用得相对较少也是比较新的框架.

GDOM框架主要是用来解析XML文件的框架,在解析一个XML文件的过程特别复杂,具体使用的时候需要结合自己的比较进行解析.不过大致好像是实现五个代理方法对文件进行解析,像剥竹笋一样从外像里一点一点的解析.XML主要使用来传输大量的数据.

RHAddress框架主要是用来制作联系人界面的框架.

MJPhoteBrowser框架主要是用来制作图片浏览器,不过在使用的时候需要注意的地方是需要把图片对象转换为MJPhoto对象.

SDWebImage框架,解决了图片的异步下载,并且还有缓存机制.不过需要注意的地方是需要在内存警告时调用 didReceiveMemoryWarning 方法里面清除一下图片的缓存.


8\怎么实现 tableView 懒加载?
    这里只能说说思想,具体实现在我的笔记里面.
主要是靠scrollView的两个代理方法来完成懒加载,在停止拖拽的时候会调用 scrollViewDidEndDragging方法 和停止滑动的时候 scrollViewDidEndDecelerating方法. 这两个代理方法.在这两个方法里面装载图片.在返回cell的方法里面判断是否有图片,如果没有的话就判断当前tableview的状态,如果当前tableview的dragging状态为NO,decelerating的状态为NO的时候下载图片.
其实最简单的方法使用是SBWebImage框架,直接就可以完成.



9\编写一个singleton的类?
      在开发的过程中有很简单框架可以帮助我实现定义单例的类,之后我再说说为什么要使用单例,使用单例的好处.使用框架制作只需要在.h文件中加入singleton_interface(类名),在.m文件中加入singleton_implement(类名)
单例,故名之意就是只有一份.使用单例的好处,就是保存不需要改变的对象,任何时刻都只有一份,这样使得我们在开发中可以在任何地方拿到我们事先做好的对象.在iOS系统中很多地方都使用到了单例,就好比application其实就是一个单例对象.
 
10\开发过程中最常见的异常有哪些,列举几个?
     结束了苦逼的MRC时代,进入ARC时代.过分依赖ARC以至于在使用C的对象的时候,也不去释放.从而导致内存泄露.

     tableview滑动的时候特别的卡,这种问题分三种情况考虑,1是在cell中使用了网络请求.这里说的请求是异步请求,创建很多的线程从而导致了特别卡.2还有就是使用同步请求.3.也许是在自定义cell的时候没有使用循环利用机制.导致每次都去计算各个控件的frame.这里是在使用MVVM模式的时候.

     循环引用,所有对象在控制消失的时候都得不到释放.
     
     还有在block中使用self,造成强引用.这里解决的办法,是做一个weak的self替换self,在block里面使用.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值