关于ios:2021年最新整理的iOS面试题附答案各位跳槽面试的都来看看吧

38次阅读

共计 4258 个字符,预计需要花费 11 分钟才能阅读完成。

举荐浏览:对于 iOS 面试题汇总(栏目继续更新)

最近大家都要筹备去面试或者曾经在面试的,这里我给大家筹备了挺多材料,能够私信我拿,看看理解下。底下就是我整理出来的一些面试题

iOS 类(class)和构造体(struct)有什么区别?

Swift 中,类是援用类型,构造体是值类型。值类型在传递和赋值时将进行复制,而援用类型则只会应用援用对象的一个 ” 指向 ”。所以他们两者之间的区别就是两个类型的区别。

举个简略的例子,代码如下


class Temperature {var value: Float = 37.0}

class Person {
  var temp: Temperature?

  func sick() {temp?.value = 41.0}
}

let A = Person()
let B = Person()
let temp = Temperature()

A.temp = temp
B.temp = temp

有想要支付收费材料的能够进裙或者加好友支付,这里有一个 iOS 交换圈:891 488 181 能够来理解,分享 BAT, 阿里面试题、面试教训,探讨技术,裙里材料间接下载就行,大家一起交流学习!

有想要的面试材料或者其余材料也能够找我,欢送征询!须要的可自行下载

A.sick() 下面这段代码,因为 Temperature 是 class,为援用类型,故 A 的 temp 和 B 的 temp 指向同一个对象。A 的 temp 批改了,B 的 temp 也随之批改。这样 A 和 B 的 temp 的值都被改成了 41.0。如果将 Temperature 改为 struct,为值类型,则 A 的 temp 批改不影响 B 的 temp。

内存中,援用类型诸如类是在堆(heap)上,而值类型诸如构造体切实栈(stack)上进行存储和操作。相比于栈上的操作,堆上的操作更加简单耗时,所以苹果官网举荐应用构造体,这样能够进步 App 运行的效率。

class 有这几个性能 struct 没有的:

class 能够继承,这样子类能够应用父类的个性和办法 类型转换能够在 runtime 的时候检查和解释一个实例的类型 能够用 deinit 来开释资源 一个类能够被屡次援用 struct 也有这样几个劣势:

构造较小,实用于复制操作,相比于一个 class 的实例被屡次援用更加平安。毋庸放心内存 memory leak 或者多线程抵触问题

什么是 GCD?谈谈你对 GCD 的了解?

GCD 是 Grand Central Dispatch 的缩写。

Grand Central Dispatch (GCD)是 Apple 开发的一个多核编程的较新的解决办法。在 Mac OS X 10.6 雪豹中首次推出,并在最近引入到了 iOS4.0。

GCD 是一个代替诸如 NSThread 等技术的很高效和弱小的技术。GCD 齐全能够解决诸如数据锁定和资源透露等简单的异步编程问题。

GCD 能够实现很多事件,然而这里仅关注在 iOS 利用中实现多线程所需的一些基础知识。

在开始之前,须要了解是要提供给 GCD 队列的是代码块,用于在零碎或者用户创立的的队列上调度运行。申明一个队列

如下会返回一个用户创立的队列:

dispatch_queue_t myQueue =  dispatch_queue_create("com.iphonedevblog.post",  NULL);

其中,第一个参数是标识队列的,第二个参数是用来定义队列的参数(目前不反对,因而传入 NULL)。

执行一个队列

如下会异步执行传入的代码:

dispatch_async(myQueue, ^{ [self doSomething]; }); 其中,首先传入之前创立的队列,而后提供由队列运行的代码块。

申明并执行一个队列

如果不须要保留要运行的队列的援用,能够通过如下代码实现之前的性能:dispatch_async(dispatch_queue_create (“com.iphonedevblog.post”, NULL), ^{[self doSomething]; }); 如果须要暂停一个队列,能够调用如下代码。暂停一个队列会阻止和该队列相干的所有代码运行。dispatch_suspend(myQueue);

暂停一个队列

如果暂停一个队列不要遗记复原。暂停和复原的操作和内存治理中的 retain 和 release 相似。调用 dispatch_suspend 会减少暂停计数,而 dispatch_resume 则会缩小。队列只有在暂停计数变成零的状况下才开始运行。dispatch_resume(myQueue);

复原一个队列 从队列中在主线程运行代码

有些操作无奈在异步队列运行,因而必须在主线程(每个利用都有一个)上运行。UI 绘图以及任何对 NSNotificationCenter 的调用必须在主线程长进行。在另一个队列中拜访主线程并运行代码的示例如下:dispatch_sync(dispatch_get_main_queue(), ^{[self dismissLoginWindow]; }); 留神,dispatch_suspend(以及 dispatch_resume)在主线程上不起作用。

应用 GCD,能够让你的程序不会失去响应. 多线程不容易应用,用了 GCD,会让它变得简略。你无需专门进行线程治理, 很棒!

  dispatch_queue_t   t1=dispatch_queue_create("1"  ,NULL); 
  dispatch_queue_t   t2=dispatch_queue_create("2",NULL); 
  dispatch_async(t1, ^{[self print1]; 
    }); 
  dispatch_async(t2, ^{[self print2]; 
    }); 

iOS 主动开释池是什么, 如何工作?

当您向一个对象发送一个 autorelease 音讯时,Cocoa 就会将该对象的一个援用放入到最新的主动开释池。它依然是个正当的对象,因而主动开释池定义的作用域内的其它对象能够向它发送音讯。当程序执行到作用域完结的地位时,主动开释池就会被开释,池中的所有对象也就被开释。

1、object-c 是通过一种 ”referring counting”(援用计数)的形式来治理内存的, 对象在开始分配内存 (alloc) 的时候援用计数为一, 当前每当碰到有 copy,retain 的时候援用计数都会加一, 每当碰到 release 和 autorelease 的时候援用计数就会减一, 如果此对象的计数变为了 0, 就会被零碎销毁.

2、NSAutoreleasePool 就是用来做援用计数的管理工作的, 这个货色个别不必你管的.

3、autorelease 和 release 没什么区别, 只是援用计数减一的机会不同而已,autorelease 会在对象的应用真正完结的时候才做援用计数减一.

iOS 一个 tableView 是否能够关联两个不同的数据源?你会怎么解决?

答案:首先咱们从代码来看,数据源如何关联上的,其实是在数据源关联的 * 办法里实现的。因而咱们并不关怀如何去关联他,他怎么关联上,办法只是让我返回依据本人的须要去设置如相干的数据源。因而,我感觉能够设置多个数据源啊,然而有个问题是,你这是想干嘛呢?想让列表如何显示,不同的数据源分区块显示?

iOS 类别的作用?继承和类别在实现中有何区别?

答案:

category 能够在不获悉,不扭转原来代码的状况下往里面增加新的办法,只能增加,不能删除批改。并且如果类别和原来类中的办法产生名称抵触,则类别将笼罩原来的办法,因为类别具备更高的优先级。
类别次要有 3 个作用:

(1)将类的实现扩散到多个不同文件或多个不同框架中。

(2)创立对公有办法的前向援用。

(3)向对象增加非正式协定。继承能够减少,批改或者删除办法,并且能够减少属性。

从输出 url 到页面展现到底产生了什么

  • 1、输出地址
  • 2、浏览器查找域名的 IP 地址
  • 3、浏览器向 web 服务器发送一个 HTTP 申请
  • 4、服务器的永恒重定向响应
  • 5、浏览器跟踪重定向地址
  • 6、服务器解决申请
  • 7、服务器返回一个 HTTP 响应
  • 8、浏览器显示 HTML
  • 9、浏览器发送申请获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS 等等)

iOS 中长久化形式有哪些?

属性列表文件 — NSUserDefaults 的存储,理论是本地生成一个 plist 文件,将所需属性存储在 plist 文件中

对象归档 — 本地创立文件并写入数据,文件类型不限

SQLite 数据库 — 本地创立数据库文件,进行数据处理

CoreData — 同数据库解决思维雷同,但实现形式不同

你在开发过程中罕用到哪些定时器,定时器工夫会有误差吗,如果有,为什么会有误差?

iOS 中常 NSTimer、CADisplayLink、GCD 定时器,其中 NSTimer、CADisplayLink 基于 NSRunLoop 实现,故存在误差,GCD 定时器只依赖零碎内核,绝对一前两者是比拟准时的。

误差起因是:与 NSRunLoop 机制无关,因为 RunLoop 每跑完一次圈再去查看以后累计工夫是否曾经达到定时设置的间隔时间,如果未达到,RunLoop 将进入下一轮工作,待工作完结之后再去查看以后累计工夫,而此时的累计工夫可能曾经超过了定时器的间隔时间,故会存在误差。

怎么避免指针的越界应用问题?

必须让指针指向一个无效的内存地址,

1、避免数组越界
2、避免向一块内存中拷贝过多的内容
3、避免应用空指针
4、避免扭转 const 批改的指针
5、避免扭转指向动态存储区的内容
6、避免两次开释一个指针
7、避免应用野指针.

iOS 你在我的项目中用过 runtime 吗?举个例子

Objective-C 语言是一门动静语言,编译器不须要关怀承受音讯的对象是何种类型,接管音讯的对象问题也要在运行时解决。

pragramming 层面的 runtime 次要体现在以下几个方面:

  • 关联对象 Associated Objects
  • 音讯发送 Messaging
  • 音讯转发 Message Forwarding
  • 办法调配 Method Swizzling
  • “类对象”NSProxy Foundation | Apple Developer Documentation
  • KVC、KVO About Key-Value Coding

有想要支付收费材料的能够进裙或者加好友支付,这里有一个 iOS 交换圈:891 488 181 能够来理解,分享 BAT, 阿里面试题、面试教训,探讨技术,裙里材料间接下载就行,大家一起交流学习!

文章到这里就完结了,你也能够私信我及时获取面试相干材料。如果你有什么意见和倡议欢送给我留言。

#### 请 iOS 的小伙伴关注!喜爱的话给一个赞吧!谢谢!谢谢!谢谢!

正文完
 0