举荐浏览:对于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的小伙伴关注 !喜爱的话给一个赞吧!谢谢!谢谢!谢谢!