转载

ios基础笔试题集锦二

前言

以下部分题目来源于网络,笔者在此处收集起来,既是要巩固自我,也希望能够帮助到同样需要的人!参考答案均为笔者所写,其有疑问或者出错之处,请在评论中提出,谢谢!不喜勿喷!

1、即时聊天App不会采用的网络传输方式

  A UDP B TCP  C HTTP  D FTP   

参考答案:D

理由:FTP是文件传输协议,是File Transfer Protocol的简称,它的作用是用于控制互联网上文件的双向传输,因此一定不会是即时聊天使用的;UDP是面向无连接的传输层协议,数据传输是不可靠的,它只管发,不管收不收得到;TCP是面向连接的,可靠的传输层协议;HTTP是超文本传输协议,对应于应用层,而HTTP是基于TCP的。更详细可阅读下面的文章: http://www.henishuo.com/ios-socket-theory/

2、下列技术不属于多线程的是

  A Block  B NSThread  C NSOperation D GCD   

参考答案:A

理由:苹果提供了 NSThreadNSOperationGCD 这三种技术用于处理多线程,对于 NSThread 是需要自己管理其生命周期的;对于 NSOpeartion 也是常用的技术之一,通常与 NSOperationQueue 一起配合使用;对于 GCD 是平时见到最多的,使用起来很方便,而它与 block 配合起来使用,简单而且简洁。 Block 不是一项技术,只是代码段,但是具备自动捕获上下文信息的功能,与函数指针有点类似,其实全局函数就是特殊的 block

关于 NSOperation/NSOperationQueue ,可阅读笔者的文章: http://www.henishuo.com/ios-nsoperation-queue/ ;

关于 GCD ,可阅读: http://www.henishuo.com/gcd-multiple-thread-learn/

3、线程和进程的区别不正确的是

  A 进程和线程都是由操作系统所提供的程序运行的基本单元 B 线程之间有单独的地址空间 C 进程和线程的主要差别在于它们是不同的操作系统资源管理方式 D 线程有自己的堆栈和局部变量   

参考答案:B

理由:这是学习操作系统知识的时候经常会考试的内容,但是在工作中经常会遇到多线程处理问题。通常来说,一个进程就代表着一个应用程序,而操作系统为了更好的利用资源,提供了线程用于处理并发。每个线程都有单独的地址空间,处理完成之后还得回到主线程。进程和线程都是操作系统的基本单元,只是分工不同,是再种不同的资源管理方式。线程所需要的资源都来自于进程,它没有自己独立的资源,也就没有自己的堆栈和局部变量。

4、堆和栈的区别正确的是

  A 对于栈来讲,我们需要手工控制,容易产生memoryleak B 对于堆来说,释放工作由编译器自动管理,无需我们手工控制 C 在Windows下,栈是向高地址扩展的数据结构,是连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的 D 对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低   

参考答案:D

理由:栈是由编译器管理的,不是我们手动控制,但是栈所能分配的内存是比较少的,如果要处理大数据,则需要在堆上分配,因此在栈上比较容易出现 Memory Leak ;对于堆,需要我们自己申请内存,同时也需要我们自己手动释放,否则会造成内存泄露;对于堆,如果过多地申请内存空间,会导致内存空间不连接,从而造成内存碎片,使程序效率降低。

5、下列回调机制的理解不正确的是

  A target-action:当两个对象之间有⽐较紧密的关系时,如视图控制器与其下的某个视图。       B delegate:当某个对象收到多个事件,并要求同一个对象来处理所有事件时。委托机制必须依赖于某个协议定义的⽅法来发送消息。       C NSNotification:当需要多个对象或两个无关对象处理同一个事件时。       D Block:适⽤于回调只发⽣生一次的简单任务。   

参考答案:B

理由:对于 Target-Action 机制,要求两个对象之间有比较紧密的联系,比如在控制器与cell之间,可通过设置target为控制器对象,而action则为控制器中的某个回调方法;对于 Delegator 机制,它是苹果提供的标准回调机制,通常会提供一个标准的协议,然后由代理类遵守协议,最常用的用法是反向传值,比如打开蓝牙后要反馈给前一个界面蓝牙的开关状态;对于通知,通常是多对多的关系,它并不关心是谁要处理消息,任意对象都可以注册通知到通知中心,当发送通知时,所有注册了该通知的对象都可以收到消息,最常用的场景是跨模块,比如登录模块与其它模块有着非常紧密的联系,但是登录成功后各个地方可能需要做一些处理,因此通常会在登录成功或者登出成功后发送通知,以便各个需要处理的模块得到正确的处理;对于 Block 是相当简单的,它只适用于一对一的关系,比如在做某个操作成功或者失败后回调。

6、对于runloop的理解不正确的是

  A 每一个线程都有其对应的RunLoop B 默认非主线程的RunLoop是没有运行的 C 在一个单独的线程中没有必要去启用RunLoop D 可以将NSTimer添加到runloop中   

参考答案:C

理由:说到 RunLoop ,它可是多线程的法定。通常来说,一个线程一次只能执行一个任务,执行完任务后就会退出线程。但是,对于主线程是不能退出的,因此我们需要让主线程即时任务执行完毕,也可以继续等待是接收事件而不退出,那么 RunLoop 就是关键法宝了。但是非主线程通常来说就是为了执行某一任务的,执行完毕就需要归还资源,因此默认是不运行 RunLoop 的。 NSRunLoop 提供了一个添加 NSTimer 的方法,这个方法是在应用正常状态下会回调。

7、断点续传需要在请求头中添加的控制续传最重要的关键字

  A range B length  C type  D size   

参考答案:A

理由:对于实现文件的断点续传和断点下载,需要设置请求头中的 Range 实体头,指定第一个字节的位置和最后一个字节的位置,而与之对应的响应头有 Content-Range ,指示了整个实体的长度及部分插入位置,如 Content-Range: bytes 0-500/801 ,指定了范围为当前范围与文件总大小。

8、MVC优点不正确的是

  A 低耦合性 B 高重用性和可适用性 C 较低的生命周期成本 D 代码高效率   

参考答案:D

理由:MVC只是一种设计模式,它的出现有比较久的历史了。 Model-Controller-View 是在开发中最常见到的设计模式,通过将 ModelViewController 三者相互联系,以 Model 作为数据加工厂,以 Controller 作为桥梁,处理业务,而 View 只是数据展示层,理应与业务无关。 MVC 设计模式降低了耦合性,提供了重用性和适用性,可有效地提高开发效率。

9、混编ObjC和C++的源码文件需要将文件格式的后缀改为

  A .c B .cpp C .mm D .m   

参考答案:C

理由:ObjC要想与C++源代码文件混编,那么就需要将文件后缀改为 .mm 。这个没有什么可细说了,记住就好了!

10、ObjC声明一个类所要用到的编译指令是

  A @interface SomeClass B @protocol SomeClass C @implementation SomeClass D @autorelease SomeClass   

参考答案:A

理由:A是声明类的指令;B是声明协议的指令;C是实现类的定义的指令;D是声明自动释放池的指令。

11、MRC文件在ARC工程混合编译时,需要在文件的Compiler Flags上添加什么参数

  A -shared B -fno-objc-arc C -fobjc-arc D -dynamic   

参考答案:B

理由:对于ARC工程中,如果要混编MRC文件,需要在工程的 Compiler Flags 添加 -fno-bojc-arc ;对于MRC工程中,如果要混编ARC文件,需要设置为 -fobjc-arc

12、下面关于Objective-C内存管理的描述错误的是

  A 当使用ARC来管理内存时,代码中不可以出现autorelease B autoreleasepool 在 drain 的时候会释放在其中分配的对象 C 当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露 D 在使用ARC的项目中不能使用NSZone   

参考答案:A

理由:ARC只是在大多时候编译自动为我们添加上内存管理的代码,只是我们的源代码看不到而已,但是在编译时,编译器会添加上相关内存管理代码。对于自动释放池,在drain时会将自动释放池中的所有对象的引用计数减一,若引用计数为0,则会自动释放掉其内存。如果在线程中需要大量分配内存,我们理应添加上自动释放池,以防内存泄露。比如在for循环中要分配大量的内存处理数据,那么我们应该在for循环内添加自动释放池,在每个循环后就将内存释放掉,防止内存泄露。在ARC项目中,自然不能手动使用NSZone,也不能调用父类的dealloc。

13、下面哪个不属于对象数据序列化方法

  A JSON B Property List C XML D HTTP   

参考答案:D

理由:数据序列化是将对象的数据转化成某一种格式的数据,在ios开发中最常用的就是JSON,部分公司会采用XML,笔者从未遇到过使用Property List来传输数据的,但是我们通过会将一些小量的数据存储到Property List中,比如NSUserDefaults就是操作plist文件的。而HTTP是超文件传输协议,只是一种协议。

14、在UIKit中,frame与bounds的区别是

  A. frame 是 bounds 的别名 B. frame 是 bounds 的继承类 C. frame 的参考系是父视图坐标,bounds 的参考系是自身的坐标 D. frame 的参考系是自身坐标,bounds 的参考系是父视图的坐标   

参考答案:C

理由:frame的参考系是父视图的坐标系,而bounds是参考自我的坐标系,因此获取bounds时,其origin永远是(0,0),相当于只取size。

15、下面关于线程管理错误的是

  A. GCD所用的开销要比NSThread大 B. 可以在子线程中修改UI元素 C. NSOperationQueue是比NSthread更高层的封装 D. GCD可以根据不同优先级分配线程   

参考答案:B

理由:首先,UI元素的更新必须在主线程。GCD与Block配合使用,block需要自动捕获上下文变量信息等,因此需要更多的资源,故比NSThread开销要大一些。 NSOperationQueueNSOperation 配合使用,比 NSThread 更易于操作线程。 GCD 提供了多个优先级,我们可以根据设置优先级,让其自动为我们分配线程。

关系 NSOperationQueue ,请阅读文章: http://www.henishuo.com/ios-nsoperation-queue/

写在最后

文章中难免有说得不合理的地方,如果您认为说法不正确或者哪里有错误的地方,请在评论中留言,笔者会在第一时间修正!!!

关注我

如果在使用过程中遇到问题,或者想要与我交流,可加入有问必答 QQ群: 324400294

关注微信公众号: iOSDevShares

关注新浪微博账号:标哥Jacky

支持并捐助

如果您觉得文章对您很有帮助,希望得到您的支持。您的捐肋将会给予我最大的鼓励,感谢您的支持!

支付宝捐助 微信捐助
ios基础笔试题集锦二 ios基础笔试题集锦二
正文到此结束
Loading...