iOS 面试总结

在这个公司待了三年,虽然我有足够的危机感,可是并无让我提高多少,因此我迫切的想换个工做环境,因而去了几个公司面试,有个自称是用户在三亿左右的公司,且不说用户量是真是假。问了不少混合开发的东西,弱项,可想而知有多狼狈了吧。综合几家公司的面试,写了这篇文集,有问题能够留言。谢谢。php

  1. 开发框架的选择:原生开发?混合开发?

1.1原生开发:在应用的性能上以及用户体验上是最好的,可是原生的可移植性较差,因此相对来讲开发成本会稍微高点。git

1.2H5与原生混合开发,主要的就用利用WKWebView,实现原生与H5的混合,主要利用的就是JS作一些交互(JSBridge的桥接)。若是页面须要变化量很快 或者是活动啥的,建议混合开发,能够节约成本(IOS+Android 共用一个h5界面),部署更新,升级都比较快。可是用户体验及性能上就稍微差些,并且有的也比较消耗资源。可是企业级的app 由于须要使用基础组件,如推送通知,管理,安全,分析数据同步和链接到企业的数据库,订阅等等,不一样的场景下要视状况而定。github

1.3其余的能够学习下RN,Flutter,我也打算学习fluter面试

2.如何保证app的稳定性?数据库

2.1 app稳定性首先考虑代码的逻辑,设计模式的选择等等。编程

内存问题:体如今内存泄露,内存警告方面。开发中学会使用instrument 检测内存泄露,cpu使用率(Instruments的time profile来定位并解决问题)以及启动时间(能够参考个人关于启动优化的文章)等指标,循环引用等问题。循环引用容易引发内存泄露,内存激增,进而致使Crash。常见的有Delegate,Block,NStimerswift

2.2 单元测试设计模式

可借助Xcode自带的单元测试,也可以使用第三方框架OCMock数组

2.3.Crash 的监控浏览器

3.开发中如何解决耦合性?

3.1建议看下MVVM+RAC开发

3.2目前最多见的有router 这个解决方案。viewmodel 吧展现层的数据 view /model 的业务处理隔离开。中间层的业务逻辑耦合性就很高,能够经过router 解决。

  1. jsbridge 桥接h5

基本就是依赖于 WKWebView,实现其代理,使用js 与OC的交互就能完成

5.音视频开发这块,音视频播放的原理是什么?

视音频技术主要是:音频技术,主要包括音视频的压缩编码技术,若是考虑到网络传输的话还要考虑到流媒体协议技术。

播放网上的视频文件,须要通过如下几个步骤:解协议,解封装,解码音视频,音视频同步;若是是解码本地文件则不须要解协议。

解协议:由于播放视频的时候须要遵循各类流媒体协议技术(http,RTMP,MMS等),须要解析为标准的相应的封装格式数据。能够简单的理解为不一样厂家对应不一样的音视频格式。

解封装:就是将输入的封装格式(MP3,MP4,FLv等)的数据,分离为音频流压缩编码数据或者视频流压缩编码数据。

解码:能够简单理解为就是对数据视频进行压缩/解压缩的过程。常见的有H.26X(H.264,H.265等),MPEG等。

音视频同步:就是将解码好的是音视频经过声卡/显卡 播放出来。

  1. weak 与assign 的区别?代理是什么修饰?

6.1.在ARC,weak 只能修饰对象,若是修饰基础数据类型,编译器会报错。在MRC时尚未weak 这个修饰符

6.2 assign 能够修饰对象也能够修饰基本数据类型,assign 修饰对象时会致使致使野指针问题,由于被assign修饰的对象在对象释放后,指针不会被置为nil,因此在次向对象发消息就会崩溃。可是被weak 修饰的对象则不会出现野指针的问题,当weak修饰的对象被系统回收时指针会被置为nil。再次向其发消息,不会崩溃。

6.3 经过以上咱们知道代理为何常用weak修饰,一是为了解决循环引用问题,二是为了防止野指针的出现。

7.分类可否添加属性?可否添加成员变量?为何?

7.1在{ } 内直接声明 成员变量,编译器会直接报错。因此分类不能直接添加成员变量。

7.2分类是能够声明属性的,能够经过clang 编译器查看他的底层结构

struct _category_t {

const char *name;

struct _class_t *cls;

const struct _method_list_t *instance_methods;

const struct _method_list_t *class_methods;

const struct _protocol_list_t *protocols;

const struct _prop_list_t *properties;

};

可是他只能生成set/get的声明,不能生成 set/get 方法的实现 ,因此在外部引用的时候,运行会报错。经典错误unrecognized selector sent to instance

可使用runtime的动态添加关联对象 objc_setAssociatedObject(obj, &MyKey, value, OBJC_ASSOCIATION_RETAIN_NONATOMIC) objc_getAssociatedObject实现。

  1. 成员变量与实例变量的区别是什么?属性是什么?

  2. 可变数组你常用什么修饰,可否使用copy?

可变数组使用strong修饰,不可变数组使用copy修饰

可变数组若是使用copy修饰的话,而后使其变成不可变数组,若是对数组进入增删改操做,而后发现carsh

这里涉及到 深/浅拷贝,深拷贝copy 拷贝其内存地址,浅拷贝strong 拷贝对象。

10.block 使用什么关键字修饰,为何?block 想再其内部修改外部变量,须要怎么作,缘由是什么?

10.1在MRC 下建议使用copy 修饰block,在ARC下建议使用copy/strong 修饰block

在MRC下block 的内存地址是在栈区,栈区的对象随时都会被系统回收,因此须要使用copy把它复制到堆区。

在ARC下,使用copy/strong 修饰block时,系统会对block 自动进行一个拷贝到堆区。

10.2 在ARC 下__block修饰外部变量,会将其包装成一个forwarding 指针指向本身。经过forwarding 修改内部变量的值。

11,OC Swift 混合开发,包的体积大吗?如何瘦身?

11.1 OC与Swift 混编会让你的ipa包体积增大,好比OC项目用到Swift的第三方,pod导入到工程时,会把Swift的整个库包也导入进来,致使项目至少会增长20兆左右。好在上传到appstore ,商城会进行必定的瘦身。

11.2 如何瘦身? 使用纯OC 代码代替混编。

  1. GCD原理

你们都知道苹果的大部分东西都是不开源的,网上有大牛写了个GCD的源码,供参考,奉献上连接以下:github.com/apple/swift…

另外GNUstep 是GNU计划之一,他们将Cocoa 的OC库从新写了一遍,虽然不是苹果正儿八经的源码可是能够做为参考,如下连接是:www.gnustep.org/resources/d…

// 代码片断摘自libdispatch

//typedef void (^dispatch_block_t)(void);

void

dispatch_async(dispatch_queue_t dq, dispatch_block_t work)

{

/*_dispatch_continuation_alloc 的实现

static inline dispatch_continuation_t

_dispatch_continuation_alloc(void)

{

dispatch_continuation_t dc =

_dispatch_continuation_alloc_cacheonly();

if (unlikely(!dc)) {

return _dispatch_continuation_alloc_from_heap();

}

return dc;

}

从(线程的私有存储,线程都是有本身的私有存储的,这些私有存储不会被其余线程所使用)中提取出一个 dispatch_continuation_t 结构

*/

dispatch_continuation_t dc = _dispatch_continuation_alloc();

uintptr_t dc_flags = DISPATCH_OBJ_CONSUME_BIT;

_dispatch_continuation_init(dc, dq, work, 0, 0, dc_flags);

_dispatch_continuation_async(dq, dc);

}

以上我只写了GCD的dispatch_async 异步执行的入口,你们能够下载看看源码

总结:dispatch_async用链表保存全部提交的 block,而后在底层线程池(p_thread 建立)中,依次取出 block 并执行;

dispatch_sync同步方法的实现相对来讲更简单,只须要将任务压入响应的队列,并用信号量作等待;

13.http 与 https的区别?sotocket 通信的实现原理以及其返回response的数据格式?

http:网络上使用最普遍的一种协议,是一个客户端与服务器端请求和应答的标准。用于向www服务器传输超文本到本地浏览器的一个传输协议。以明文传输,不安全。

https:简单的来讲是http的安全版。在http的基础上嵌入了SSL协议。SSL是依靠证书来验证服务器的身份,并为浏览器与服务器之间的通信进行加密。

加密解密等等三次握手自行脑补吧

socket: Socket是应用层与TCP/IP协议族通讯的中间软件抽象层,它是一组接口,能够理解为是编程接口,是对tcp/ip的封装。网络上的两个程序之间想要实现数据的双向传输交换(网络上的两个程序经过一个双向的通讯链接实现数据的交换,这个链接的一端称为一个socket)。

socket:开->读,写->关闭。socket便是一种特殊的文件。 网络层的“ip地址”能够惟一标识网络中的主机,而传输层的“协议+端口”能够惟一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就能够标识网络的进程了,网络中的进程通讯就能够利用这个标志与其它进程进行交互。

14.weak的实现原理?

weak 自己是个hash 表。key 是所指对象的地址,Value是weak 指针的地址数组(一个对象可能被多个弱指针指向)。runtime维护了一个weak表,用于存储一个对象的全部的weak指针。

一、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。

二、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak() 的做用是更新指针指向,建立对应的弱引用表。

三、释放时,调用clearDeallocating函数 首先根据对象地址获取全部weak指针地址的数组,而后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。


原文:blog.csdn.net/qq_33726122…

本文源自第三方转载。

相关文章
相关标签/搜索