标签:
以下部分题目来源于网络,笔者在此处收集起来,既是要巩固自我,也希望能够帮助到同样需要的人!参考答案均为笔者所写,其有疑问或者出错之处,请在评论中提出,谢谢!不喜勿喷!
1
2
3
4
5
6
|
A UDP
B TCP
C HTTP
D FTP
|
参考答案:D
关于socket理论基础知识,更详细可阅读下面的文章:Socket理论知识
1
2
3
4
5
6
|
A Block
B NSThread
C NSOperation
D GCD
|
参考答案:A
苹果提供了NSThread
、NSOperation
、GCD
这三种技术用于处理多线程。
NSThread
是需要自己管理其生命周期的;NSOpeartion
也是常用的技术之一,通常与NSOperationQueue
一起配合使用;GCD
是平时见到最多的,使用起来很方便,而它与block
配合起来使用,简单而且简洁。Block
不是一项技术,只是代码段,但是具备自动捕获上下文信息的功能,与函数指针有点类似,其实全局函数就是特殊的block
。关于NSOperation/NSOperationQueue
,可阅读笔者的文章:多线程之NSOperatoin/NSOperationQueue;
关于GCD
,可阅读:GCD多线程
1
2
3
4
5
6
|
A 进程和线程都是由操作系统所提供的程序运行的基本单元
B 线程之间有单独的地址空间
C 进程和线程的主要差别在于它们是不同的操作系统资源管理方式
D 线程有自己的堆栈和局部变量
|
参考答案:B
这是学习操作系统知识的时候经常会考试的内容,但是在工作中经常会遇到多线程处理问题。通常来说,一个进程就代表着一个应用程序,而操作系统为了更好的利用资源,提供了线程用于处理并发。线程之间没有有单独的地址空间,处理完成之后还得回到主线程,所以,一个线程死掉就等于整个进程死掉。进程和线程都是操作系统的基本单元,只是分工不同,是两种不同的资源管理方式。线程所需要的资源都来自于进程,它没有自己独立的资源,也就没有自己的堆栈和局部变量。
修正:这里参考答案与描述不符合的问题。
1
2
3
4
5
6
|
A 对于栈来讲,我们需要手工控制,容易产生memory leak
B 对于堆来说,释放工作由编译器自动管理,无需我们手工控制
C 在Windows下,栈是向高地址扩展的数据结构,是连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的
D 对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低
|
参考答案:D
Memory Leak
;
1
2
3
4
5
6
|
A target-action:当两个对象之间有?较紧密的关系时,如视图控制器与其下的某个视图。
B delegate:当某个对象收到多个事件,并要求同一个对象来处理所有事件时。委托机制必须依赖于某个协议定义的?法来发送消息。
C NSNotification:当需要多个对象或两个无关对象处理同一个事件时。
D Block:适?于回调只发?生一次的简单任务。
|
参考答案:B
Target-Action
机制,要求两个对象之间有比较紧密的联系,比如在控制器与cell之间,可通过设置target为控制器对象,而action则为控制器中的某个回调方法;Delegator
机制,它是苹果提供的标准回调机制,通常会提供一个标准的协议,然后由代理类遵守协议,最常用的用法是反向传值,比如打开蓝牙后要反馈给前一个界面蓝牙的开关状态;Block
是相当简单的,它只适用于一对一的关系,比如在做某个操作成功或者失败后回调。
1
2
3
4
5
6
|
A 每一个线程都有其对应的RunLoop
B 默认非主线程的RunLoop是没有运行的
C 在一个单独的线程中没有必要去启用RunLoop
D 可以将NSTimer添加到runloop中
|
参考答案:C
说到RunLoop
,它可是多线程的法宝。通常来说,一个线程一次只能执行一个任务,执行完任务后就会退出线程。但是,对于主线程是不能退出的,因此我们需要让主线程即时任务执行完毕,也可以继续等待接收事件而不退出,那么RunLoop
就是关键法宝了。但是非主线程通常来说就是为了执行某一任务的,执行完毕就需要归还资源,因此默认是不运行RunLoop
的。
NSTimer
的方法,可以指定Mode,如果要让任何情况下都回调,则需要设置Mode为Common模式。实质上,对于子线程的runloop默认是不存在的,因为苹果采用了懒加载的方式。如果我们没有手动调用[NSRunLoop currentRunLoop],就不会去查询是否存在当前线程的RunLoop,也就不会去加载,更不会创建。
下面是CFRunLoop的部分源码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
// should only be called by Foundation
// t==0 is a synonym for "main thread" that always works
CF_EXPORT CFRunLoopRef _CFRunLoopGet0(pthread_t t) {
if (pthread_equal(t, kNilPthreadT)) {
t = pthread_main_thread_np();
}
__CFSpinLock(&loopsLock);
if (!__CFRunLoops) {
__CFSpinUnlock(&loopsLock);
CFMutableDictionaryRef dict = CFDictionaryCreateMutable(kCFAllocatorSystemDefault, 0, NULL, &kCFTypeDictionaryValueCallBacks);
CFRunLoopRef mainLoop = __CFRunLoopCreate(pthread_main_thread_np());
CFDictionarySetValue(dict, pthreadPointer(pthread_main_thread_np()), mainLoop);
if (!OSAtomicCompareAndSwapPtrBarrier(NULL, dict, (void * volatile *)&__CFRunLoops)) {
CFRelease(dict);
}
CFRelease(mainLoop);
__CFSpinLock(&loopsLock);
}
CFRunLoopRef loop = (CFRunLoopRef)CFDictionaryGetValue(__CFRunLoops, pthreadPointer(t));
__CFSpinUnlock(&loopsLock);
if (!loop) {
CFRunLoopRef newLoop = __CFRunLoopCreate(t);
__CFSpinLock(&loopsLock);
loop = (CFRunLoopRef)CFDictionaryGetValue(__CFRunLoops, pthreadPointer(t));
if (!loop) {
CFDictionarySetValue(__CFRunLoops, pthreadPointer(t), newLoop);
loop = newLoop;
}
// don‘t release run loops inside the loopsLock, because CFRunLoopDeallocate may end up taking it
__CFSpinUnlock(&loopsLock);
CFRelease(newLoop);
}
if (pthread_equal(t, pthread_self())) {
_CFSetTSD(__CFTSDKeyRunLoop, (void *)loop, NULL);
if (0 == _CFGetTSD(__CFTSDKeyRunLoopCntr)) {
_CFSetTSD(__CFTSDKeyRunLoopCntr, (void *)(PTHREAD_DESTRUCTOR_ITERATIONS-1), (void (*)(void *))__CFFinalizeRunLoop);
}
}
return loop;
|
关键加载过程如下:
1
2
3
4
5
6
|
A range
B length
C type
D size
|
参考答案:A
理由:对于实现文件的断点续传和断点下载,需要设置请求头中的Range
实体头,指定第一个字节的位置和最后一个字节的位置,而与之对应的响应头有Content-Range
,指示了整个实体的长度及部分插入位置,如Content-Range: bytes 0-500/801
,指定了范围为当前范围与文件总大小。
1
2
3
4
5
6
|
A 低耦合性
B 高重用性和可适用性
C 较低的生命周期成本
D 代码高效率
|
参考答案:D
理由:MVC只是一种构架设计模式,它的出现有比较久的历史了。Model-Controller-View
是在开发中最常见到的架构设计模式,通过将Model
、View
、Controller
三者相互联系,以Model
作为数据加工厂,以Controller
作为桥梁,处理业务,而View
只是数据展示层,理应与业务无关。MVC
设计模式降低了耦合性,提供了重用性和适用性,可有效地提高开发效率。
1
2
3
4
5
6
|
A .c
B .cpp
C .mm
D .m
|
参考答案:C
理由:ObjC要想与C++源代码文件混编,那么就需要将文件后缀改为.mm
。这个没有什么可细说了,记住就好了!
1
2
3
4
5
6
|
A @interface SomeClass
B @protocol SomeClass
C @implementation SomeClass
D @autorelease SomeClass
|
参考答案:A
理由:A是声明类的指令;B是声明协议的指令;C是实现类的定义的指令;D是声明自动释放池的指令。
1
2
3
4
5
6
|
A -shared
B -fno-objc-arc
C -fobjc-arc
D -dynamic
|
参考答案:B
理由:对于ARC工程中,如果要混编MRC文件,需要在工程的Compiler Flags
添加-fno-objc-arc
;对于MRC工程中,如果要混编ARC文件,需要设置为-fobjc-arc
。
1
2
3
4
5
6
|
A 当使用ARC来管理内存时,代码中不可以出现autorelease
B autoreleasepool 在 drain 的时候会释放在其中分配的对象
C 当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露
D 在使用ARC的项目中不能使用NSZone
|
参考答案:A
理由:ARC只是在大多时候编译自动为我们添加上内存管理的代码,只是我们的源代码看不到而已,但是在编译时,编译器会添加上相关内存管理代码。对于自动释放池,在drain时会将自动释放池中的所有对象的引用计数减一,若引用计数为0,则会自动释放掉其内存。如果在线程中需要大量分配内存,我们理应添加上自动释放池,以防内存泄露。比如在for循环中要分配大量的内存处理数据,那么我们应该在for循环内添加自动释放池,在每个循环后就将内存释放掉,防止内存泄露。在ARC项目中,自然不能手动使用NSZone,也不能调用父类的dealloc。
1
2
3
4
5
6
|
A JSON
B Property List
C XML
D HTTP
|
参考答案:D
理由:数据序列化是将对象的数据转化成某一种格式的数据,在ios开发中最常用的就是JSON,部分公司会采用XML,笔者从未遇到过使用Property List来传输数据的,但是我们通过会将一些小量的数据存储到Property List中,比如NSUserDefaults就是操作plist文件的。而HTTP是超文件传输协议,只是一种协议。
1
2
3
4
5
6
|
A. frame 是 bounds 的别名
B. frame 是 bounds 的继承类
C. frame 的参考系是父视图坐标,bounds 的参考系是自身的坐标
D. frame 的参考系是自身坐标,bounds 的参考系是父视图的坐标
|
参考答案:C
理由:frame的参考系是父视图的坐标系,而bounds是参考自我的坐标系。修改父视图的bounds可以移动子视图。不过通常不会这么干法,如果父视图不需要移动,没有必要修改bounds,直接修改子视图的frame就可以实现了。
1
2
3
4
5
6
|
A. GCD所用的开销要比NSThread大
B. 可以在子线程中修改UI元素
C. NSOperationQueue是比NSthread更高层的封装
D. GCD可以根据不同优先级分配线程
|
参考答案:B
理由:首先,UI元素的更新必须在主线程。GCD与Block配合使用,block需要自动捕获上下文变量信息等,因此需要更多的资源,故比NSThread开销要大一些。NSOperationQueue
与NSOperation
配合使用,比NSThread
更易于操作线程。GCD
提供了多个优先级,我们可以根据设置优先级,让其自动为我们分配线程。
关系NSOperationQueue
,请阅读文章:NSOperationQueue
标签:
原文地址:http://www.cnblogs.com/Horkly/p/5463321.html