美文网首页iOS技术专题IT面试
iOS程序员面试题(一)

iOS程序员面试题(一)

作者: iOS开发工程师 | 来源:发表于2016-04-19 19:21 被阅读292次

    1.  App上线流程

     1.appID       2.发布证书    3.在官网填写app的信息        4.压缩打包       5.在官网添加打包好的工程       6.提交审核 等待结果

    2.KVO KVC的区别?在实际工作中在哪用到了 KVC KVO?

    KVC 键值编码 通过把属性名 当成key 来改变属性的值

    KVO 键值观察者 通过KVC的方式 把属性当做key 来观察属性值的变化  做出响应

    数据转模型 用到了KVC

    封装下拉改变导航栏透明度的时候  使用的是KVO

    3.单例

    通过方法让对象只创建一次,可以避免重复创建 ,节省内存开支。

    4.浅复制和深复制的区别?

    浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。//通过对象的指针来访问这个对象----只赋值地址,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的 只不过是是一个指针,对象本身资源 还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一 个思想。

    深层复制(mutableCopy):复制引用对象本身---再创建一个对象 意思就是有个A对象,复制一份后得到A_copy对象后,深复制就好理解了,内存中存在了,两份独立对象本身。

    5.数据持久化存储方式有哪些?以及特点?

    1.plist 属性列表 最外层只能存储数组字典 里面只能存储 bool NSNumber String Data Date

    2.NSUserDefault 最终也是保存成plist 系统封装了保存的路径 保存的方法

    3.归档 可以对保存数据的文件 进行加密

    4.sqlite  关系型数据库 以表的形式存储  FMDB是对 OC中 sqlite操作封装 的第三方库

    5.coreData 是苹果封装的 对文件操作的框架 可以 以对象的形式存储 底层数据文件可以是sqlite类型 也可以是XML JSON …

    6.谈谈你对MVC的理解?  为什么要用MVC?

    MVC就是Model-View-Controller的缩写,M指的是业务模型,V指的是用户页面,C指的是控制器。MVC是架构模式,是讲M和 V的代码分离,从而使同那个一个程序可以使用不同的表现形式。

    7. 面向对象的三个基本特征是?

     封装、继承、多态

    8.线程与进程的区别和联系?

    线程是进程的基本单位进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。

    进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下get post 不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的 地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较 大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。

    9.多线程有几种方式? 

    NSTherd, NSOperation, GCD

    10.检查内存管理问题的方式有哪些?

    1)点击Xcode顶部菜单中的Product Analyze。这种方法主要可以查看内存泄露,变量未初始化,变量定义后没有被使用到

    2)使用Instrument工具检查。点击Xcode顶部菜单中的Product Profile,弹出一个界面,选择左侧的Memory后,再选右侧的Leaks。

    3)人工检查

    11.分类,延展,继承?

    分类:一般用于扩展一个类的方法,它可以不用创建一个新的类,但是不能够扩充成员变量,使用分类重写本类的方法后无法再调用原来的方法,使用分类还能够将一个类的定义写在不同的文件内,可以拆分业务逻辑,使一个分类的功能更专一。

    延展(extension):延展相当于匿名的分类,一般写在实现文件里面(.m文件),它可以扩充私有变量和方法,但是变量和方法只能在本文件内有效(私有的),其他文件不可以调用。(并且一般不会有人通过延展扩充方法)。

    继承 :使用继承扩充一个类,需要再创建一个子类,能够扩充成员变量和方法,可以重写父类的方法,而且可以通过super调用父类的方法,但是由于继承于父类。

    12.项目:自适应Cell(流程)

    需要自适应cell时,首先要自定义Cell视图,自定义时最好使用分层的设计,这样的设计方式可以增加代码的复用性,看起来也比较清晰,更改需求时,代码的变动也比较小然后肯定要有数据模型model,然后还要根据分层创建对应的frameModel,每一个frameModel对应一个Cell的层,使用时通过frameModel给对应的控件frame赋值,在frameModel内部则是,通过最底层的frameModel中的model数据传递给上层的frameModle模型,直到最后的分层,然后通过数据计算相应控件的大小,然后最上层的frameModel将自己的frame传递给下层,这样一级一级传递,到达最底层的frameModel时就可以计算出所对应的cellHeight。

    13.程序构架(流程)

    写框架前 要仔细分析各个模块及控制器之间的跳转和依赖的关系,比如分析一下看看这几个控制之间有没有什么样的view是可以重用的,如果有的话,就不要在第一次使用的这个View是将其和控制器绑定在一块,可以自定义一个view,以备以后重用时简便,考虑以后需求修改的可能性,我感觉最好逻辑比较复杂又有tableview或者collectionView时都是用UIViewController作为底层控制器比较好,只是在上面添加你想用的到View即可。

    14.自定义控件(流程)

    自定义控件经常是使用,一般情况下,自定义一个控件首先你要知道这个控件是干嘛用得,它需不需要显示图片,文字,需不需要点击,需不需要变动frame等,然后根据响应的需求留下对应的接口,比如点击一个自定义控件,那这个控件需要通知控制它被点击了,简单情况下如果只有一个button,只需要通知一个控制器,就可以通过外部定义一个。

    15.收藏、最近?

    收藏和最近主要就是使用工具类对数据进行增加和删除,保存数据时要重写数据的equalto方法(因为计算机是根据内存地址比较的,而有时候内存地址虽然不同,但是储存的数据确实一样的,所以一般根据数据的位置标识(例如id值)比较)

    如果是做最近,就需要将上一次的数据删除,添加新的数据进来,如果在搜藏是需要记录控件的编辑和选中状态,就需要在数据模型中添加相应的属性,利用数据来控制控件的状态

    常出现的问题就是使用tableview时会出现循环利用的问题,这个问题就可以使用数据的值来避免,每次加载cell时,他的状态是受数据控制的,数据不会发生循环利用的问题,这个问题也就不会出现了。

    16.推送流程?

    一般意义上说推送就是指远程推送,本地推送一般可以用来提示长时间未进入应用的用户,也可以用来做闹铃。

    (一个程序可以推送,首先你要向苹果公司注册推送证书)

    下面详细说一下远程推送的流程:

    1.当你的程序需要推送时,通过UIApplication中的registerUserNotification注册远程推送,注册后,你的程序会通过iOS系统向APNs服务器请求,APNs服务器接到请求后会将请求设备的device token(设备令牌)发送回你的应用,在UIApplication的代理方法中可以接收到device token,如果请求失败也会通过代理方法返回错误信息。

    2.当应用程序拿到device token后,就可以将device token回传给应用提供商服务器,服务器就知道了这台设备可以推送消息了,然后将device token储存在服务器内部,device token的生成算法只有苹果公司才知道,所以为了防止苹果修改算法造成推送失败,最好每次启动程序时都请求一次device token,在device token发生改变时,告诉服务器新的device token。

    (推送一般情况下是程序提供商向用户推送一些最新的消息或者资讯,不过比如QQ,微信等可以在离线的情况下进行消息的提醒,下面以qq推送离线消息为例,相比从服务器推送,qq离线消息的推送是由客户端编辑信息的)。

    3.现在如果程序要推送消息了,就可以将消息和要发送的对象的账号发送给程序提供商服务器,服务器会通过你要推送的对象的账号信息找到对应绑定的device token,然后将推送消息内容和device token传给APNs服务器。

    4.APNs服务器在接收到消息内容和device token后会查找已注册的设备然后将对应的信息和device token推送到指定的设备上,设备通过device token中的app id找到要推送的app,然后信息会按照app的推送设置显示信息。

    推送流程:

    deviceToken:包括appID和UDID。手机在联网状态下,与苹果有个长连接,可以生成一个deviceToken,在appdelegate的didReceiveXXX方法里和可以获取deviceToken。

    17.二维码?

    做二维码的话,可以使用的第三发库有ZBar和ZXing具体使用方法可以去网上查看文档

    但是现在iOS中的AVFoundation框架中也集成了二维码扫描,用起来也十分方便,并且扫描速度也更快,还可以使用AVFoundation框架生成二维码。

    18.支付功能:支付宝,微信,银联?

    支付宝

    1.导入AlipaySDK.bundle   AlipaySDK.framework 系统库SystemConfiguration.framework

    2.导入头文件 #import

    3.info.plist注册scheme

    4.配置请求Order信息

    《1》将商品信息拼接成字符串

    《2》获取私钥并签名商户信息

    《3》生成订单

    5.设置回调方法

    微信

    1.开放平台申请帐号 并开通支付功能

    2.导入SDK 添加依赖库

    3.后台生成订单 开始支付

    4.用户确认信息输入密码

    5.支付完成 跳回app

    银联

    UPPayPlugin无卡交易

    UPPayPluginPro无卡交易和VIPOS音频口支付

    需要把.m改成.mm

    1.添加SDK包 添加系统库

    2.服务器准备交易流水号

    3.startPay 开始支付

    4.设置回调方法  

    @end

    相关文章

      网友评论

        本文标题:iOS程序员面试题(一)

        本文链接:https://www.haomeiwen.com/subject/qytzlttx.html