【iOS】面试题

面试题这种东西,你看或者不看,它就在那里,不增不减。

面试官这种生物,你喜或者不喜,他就在那里,静候佳音。


【第一部分】 通用面试题

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

1
A UDP B TCP C HTTP D FTP

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

1
A Block B NSThread C NSOperation D GCD

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

1
2
3
4
5
6
7
A 进程和线程都是由操作系统所体会的程序运行的基本单元

B 线程之间有单独的地址空间

C 进程和线程的主要差别在于它们是不同的操作系统资源管理方式

D 线程有自己的堆栈和局部变量

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

1
2
3
4
5
6
7
A 对于栈来讲,我们需要手工控制,容易产生memory leak

B 对于堆来说,释放工作由编译器自动管理,无需我们手工控制

C 在Windows下,栈是向高地址扩展的数据结构,是连续的内存区域,栈顶的地址和栈的最大容量是系统预先规定好的

D 对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低

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

1
2
3
4
5
6
7
A 目标动作对:当两个对象之间有⽐比较紧密的关系时,如视图控制器与其下的某个视图。       

B 代理:也叫委托,当某个对象收到多个事件,并要求同一个对象来处理所有事件时。委托机制必须依赖于某个协议定义的⽅法来发送消息。

C 通告机制:当需要多个对象或两个⽆无关对象处理同一个事件时。

D Block:适⽤于回调只发⽣生一次的简单任务。

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

1
2
3
4
5
6
7
A 每一个线程都有其对应的RunLoop

B 默认非主线程的RunLoop是没有运行的

C 在一个单独的线程中没有必要去启用RunLoop

D 可以将NSTimer添加到runloop中

7、UITableView中cell的复用是由几个数组实现的 B

1
A 1 B 2  C 3 D 3或4

8、在线播放视频一般访问服务器中的( )类型文件 A

1
A M3U8 B flv C MP4 D data

9、点击Button响应链中最终得到响应的是 B

1
A Window B Application C AppDelegate D UIViewController

10、内存管理理解不正确的是 B

1
2
3
4
5
6
7
A 程序A里有一段内存被成功申请完成之后,内存计数器就从0变为1 (这个过程是alloc);  

B 程序B里要使用已存在内存,那么内存计数器从1变为2 (这个过程是retain或者copy);

C 紧接着程序A不需要这个内存了,那么程序A就把这个内存计数器减1 (这个过程是release);

D 当系统发现这个内存计数器变为小于等于0,那么就调用垃圾回收程序把这段内存回收(这个过程是dealloc);

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

1
A range B length C type D size

12、post传输的最大文件限制为 C

1
A 1G B 2G C 4G  D 8G

13、MVC优点不正确的是 D

1
2
3
4
5
6
7
A 低耦合性

B 高重用性和可适用性

C 较低的生命周期成本

D 代码高效率

【第二部分】 推荐面试题

1-10 C语言 & 计算机基础


1、请看下面一段代码

1
2
3
4
5
6
7
8
9
10
11
12
static int a = 1;

int main() {

int b = 2;

char *c = NULL;

c = (char *)malloc(100 * sizeof(char));

return 0;
}

请问访问a,b,c 3种类型变量的效率从高到低依次是

1
2
3
4
5
6
7
A. cba

B. abc

C. acb

D. bca

B

2、下面四种内部排序算法中哪一种在最差情况下时间复杂度最高?

1
2
3
4
5
6
7
A. 快速排序

B. 冒泡排序

C. 堆排序

D. 归并排序

B

3、Shell中,将command1的输出作为command2的输入应该使用的命令是

1
2
3
4
5
6
7
A. command1 && command2

B. command1 > command2

C. command1 & command2

D. command1 | command2

D

4、下面的数据结构中不属于线性结构的是

1
2
3
4
5
6
7
A. 栈

B. 链表

C. 二叉树

D. 线性表

C

5、在一个二叉树上,第5层最多可以有的节点数是

1
2
3
4
5
6
7
A. 2

B. 8

C. 16

D. 32

C

6、在长度为n的线性表上进行顺序查找,在最糟糕的情况下需要的比较次数是

1
2
3
4
5
6
7
A. n

B. 2n-1

C. 2n

D. n^2

A

7、下面那项不是动态语言的特性

1
2
3
4
5
6
7
A. 在运行时替换一个类

B. 在运行时动态加载lib文件

C. 在运行时修改对象中的方法

D. 在运行时增加对象的方法

B

8、已知二叉树后序遍历序列是dabec,中序遍历序列是debac,它的前序遍历序列是

1
2
3
4
5
6
7
A. cedba

B. acbed

C. decab

D. deabc

A

9、以下多线程对int型变量x的操作,哪个不需要进行同步:

1
2
3
4
5
6
7
A. x=y

B. x++

C. ++x

D. x=1

D

10、多线程中栈与堆是公有的还是私有的

1
2
3
4
5
6
7
A. 栈公有, 堆私有

B. 栈公有,堆公有

C. 栈私有, 堆公有

D. 栈私有,堆私有

C

11-20 Objective-C & Xcode


11、在Xcode中,需要编译混合Objective-C和C++的源码文件,需要将文件格式的后缀改为

1
2
3
4
5
6
7
A. .c

B. .cpp

C. .mm

D. .m

C

12、Objective-C声明一个类所要用到的编译指令是

1
2
3
4
5
6
7
A. @interface SomeClass

B. @protocol SomeClass

C. @implementation SomeClass

D. @autorelease SomeClass

A

13、使用Xcode创建工程时,支持同时创建的版本管理库是

1
2
3
4
5
6
7
A. Subversion

B. Mercurial

C. Git

D. Concurrent Versions System

C

14、下面那个方法不属于NSObject的内省(Introspection)方法

1
2
3
4
5
6
7
A. init

B. isKindOfClass

C. responseToSelector

D. isMemberOfClass

A

15、使用protocol时,声明一组可选择实现与否的函数,需要在声明的前一行加上:

1
2
3
4
5
6
7
A. @required

B. @optional

C. @interface

D. @protocol

B

@required 是必须实现,它的代理必须实现协议中的 @required 方法。

如果不声明 @optional,默认 @required。

16、需要在手动管理内存分配和释放的Xcode项目中引入和编译用ARC风格编写的文件,需要在文件的Compiler Flags上添加参数:

1
2
3
4
5
6
7
A. -shared

B. -fno-objc-arc

C. -fobjc-arc

D. -dynamic

C

  • MRC中引入ARC文件:

    -fobjc-arc

  • ARC中引入MRC文件:

    -fno-objc-arc

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

1
2
3
4
5
6
7
A. 当使用ARC来管理内存时,代码中不可以出现autorelease

B. autoreleasepool 在 drain 的时候会释放在其中分配的对象

C. 当使用ARC来管理内存时,在线程中大量分配对象而不用autoreleasepool则可能会造成内存泄露

D. 在使用ARC的项目中不能使用NSZone

A

18、下面关于#import和#include的描述正确的是

1
2
3
4
5
6
7
A. #import 是 #include 的替代指令,防止重复引用

B. #import 和 #include 不可以混合使用

C. #import 只用于引用 Objective-C的文件,#include 只用于引用C和C++的文件

D. #import 和 #include 的使用效果完全相同

A

19、下面的代码问题在哪?

1
2
3
4
5
6
7
@implementation xxx


- (void) setVar:(int)i {

self.var = i;
}

答案是:

1
2
3
4
5
6
7
A. 应该将var synthesize

B. 调用会出现死循环

C. 正常

D. 返回值错误

B

20、下面那个方法可以比较两个 NSString *str1, *str2 的异同

1
2
3
4
5
6
7
A. if(str1 = str2) xxx ;

B. if([str1 isEqualToString:str2]) xxx ;

C. if(str1 && str2) xxx ;

D. if([str1 length] == [str2 length]) xxx;

B

21-30 iOS


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

1
2
3
4
5
6
7
A. JSON

B. Property List

C. XML

D. HTTP

D

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

1
2
3
4
5
6
7
A. frame 是 bounds 的别名

B. frame 是 bounds 的继承类

C. frame 的参考系是父视图坐标,bounds 的参考系是自身的坐标

D. frame 的参考系是自身坐标,bounds 的参考系是父视图的坐标

C

23、Objective-C有私有方法吗?有私有变量吗?

1
2
3
4
5
6
7
A. 有私有方法和私有变量

B. 没有私有方法也没有私有变量

C. 没有私有方法,有私有变量

D. 有私有方法,没有私有变量

C

>

这里选 C 是有疑点的。

私有变量不用说了,在.m里面匿名声明的就是私有变量了。

私有方法则是值得推敲的。其实在.m里面不声明直接实现的方法,从效果上来讲,应该也能算是私有方法了,因为包括它的子类在内的其他类,都是无法访问该方法的。当然,称之为“隐藏方法”或许更好。

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

1
2
3
4
5
6
7
A. GCD所用的开销要比NSThread大

B. 可以在子线程中修改UI元素

C. NSOperationQueue是比NSthread更高层的封装

D. GCD可以根据不同优先级分配线程

B

25、下面代码的作用是让doSomeThing函数每隔1秒被调用1次。

1
2
3
NSTimer *myTimer = [NSTimer timerWithTimeInterval:1.0f target:self selector:@selector(doSomething:) userInfo:nil repeats:YES];

[myTimer fire];

请问哪里有问题?

1
2
3
4
5
6
7
A. 没有将timer加入runloop

B. doSomeThing缺少参数

C. 忘记传递数据给userInfo

D. myTimer对象未通过[[myTimer alloc] init]方法初始化

A

26、UIViewController在显示过程中,各个方法的调用顺序是

1
2
3
4
5
6
7
A. init -> viewDidLoad -> viewDidAppear -> viewDidUnload

B. init -> viewDidAppear -> viewDidLoad -> viewDidUnload

C. init -> viewDidLoad -> viewDidUnload -> viewDidAppear

D. init -> viewDidAppear -> viewDidUnload -> viewDidLoad

A

viewDidUnload 在iOS 5.0之后不再生效,类似的方法:
didReceiveMemoryWarning // 接收到内存警告时调用

官方文档:

- viewDidUnload (iOS 6.0)
Called when the controller’€™s view is released from memory.

Deprecation Statement
Views are no longer purged under low-memory conditions and so this method is never called.

Declaration
OBJECTIVE-C
- (void)viewDidUnload

Discussion
In iOS 5 and earlier, when a low-memory condition occurred and the current view controller’€™s views were not needed, the system could opt to call this method after the view controller’€™s view had been released. This method was your chance to perform any final cleanup. If your view controller stored separate references to the view or its subviews, you could use this method to release those references. You could also use this method to remove references to any objects that you created to support the view but that are no longer needed now that the view is gone. You would not use this method to release user data or any other information that cannot be easily recreated.
In iOS 6 and later, clearing references to views and other objects in your view controller is unnecessary.
At the time this method is called, the view property is nil.

Availability
Available in iOS 3.0 and later.
Deprecated in iOS 6.0.

27、使用imageNamed方法创建UIImage对象时,与普通的init方法有什么区别?

1
2
3
4
5
6
7
A. 没有区别,只是为了方便

B. imageNamed方法只是创建了一个指针,没有分配其他内存

C. imageNamed方法将图片加载到内存中后不再释放

D. imageNamed方法将使用完图片后立即释放

C

28、一个类的delegate(代理)的作用不正确的是

1
2
3
4
5
6
7
A. delegate中的函数在其他类中实现

B. 主要用于不同类型的对象之间一对一传递消息

C. 没有指派则不会触发

D. 可以一个对象的delegate指派给多个其他类型的对象

D

29、在没有navigationController的情况下,要从一个ViewController切换到另一个ViewController应该

1
2
3
4
5
6
7
A. [self.navigationController pushViewController:nextViewController animated:YES];

B. [self.view addSubview:nextViewController.view];

C. [self pushViewController:nextViewController animated:YES];

D. [self presentModalViewController:nextViewController animated:YES];

D

从iOS5.0开始,D项应该更新为

[self presentViewController:nextViewController animated:YES completion:nil];

presentModalViewController:animated: iOS 6.0已过期

官方文档:

- presentModalViewController:animated: (iOS 6.0)
Presents a modal view managed by the given view controller to the user.

Deprecation Statement
Use presentViewController:animated:completion: instead.

30、什么是key window?

1
2
3
4
5
6
7
A. App中唯一的那个UIWindow对象

B. 可以指定一个key的UIWindow

C. 可接收到键盘输入等事件的UIWindow

D. 不可以隐藏的那个UIWindow对象

C

官方文档:

“The key window is the one that is designated to receive keyboard and other non-touch related events. Only one window at a time may be the key window.”

翻译过来就是说,keyWindow是指定的用来接收键盘以及非触摸类的消息,而且程序中每一个时刻只能有一个window是keyWindow。

参考:UIWindow的一点儿思考–一片枫叶

31-39 代码


31、求以下程序段的输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int test(int x, int y) {

x = x + y;

return x * y;
}

int main(int argc, const char * argv[]) {

@autoreleasepool {

int x = 3, y = 10, z = test(x, y);

NSLog(@"%d%d", x++, ++z);
}

return 0;
}

答案是 A

1
A 331 B 330  C 431 D  430

32、求以下程序段的输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int func(int x) {    

int countx = 0;

while (x) {

countx++;

x = x&(x-1);
}

return countx;
}

int main(int argc, const char * argv[]) {

@autoreleasepool {

NSLog(@"%d", func(2013));
}

return 0;
}

答案是 D

1
A 1 B 5 C 8 D 9

33、下面说法不正确的是 C

1
2
3
4
5
6
7
A readwrite 是可读可写特性;需要生成getter方法和setter方法时

B readonly 是只读特性 只会生成getter方法 不会生成setter方法 ;不希望属性在类外改变

C assign 是赋值特性,和weak一样,可用weak代替;

D retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;

34、对于语句 NSString *obj = [[NSData alloc] init]; obj在编译时和运行时分别时什么类型的对象? A

1
2
3
4
5
6
7
A 编译时是NSString的类型;运行时是NSData类型的对象

B 编译时是NSObject的类型;运行时是NSData类型的对象

C 编译时是NSData的类型;运行时是NSString类型的对象

D 编译时是NSObject的类型;运行时是NSString类型的对象

35、Objective-C中的线程下面描述不正确的是 B

1
2
3
4
5
6
7
A 使用NSThread创建,使用GCD的dispatch

B 直接使用NSOperation,然后将其加入NSOperationQueue

C 在主线程执行代码,方法是performSelectorOnMainThread

D 如果想延时执行代码可以用performSelector:onThread:withObject:waitUntilDone:

36、下列不属于iOS存储方式的是 A

1
A NSFileManager   B 归档   C SQLite   D CoreData

37、IP Phone的原理是什么? C

1
A IPV4  B DHCP C IPV6  D DNS

38、类别的作用不正确的是 D

1
2
3
4
5
6
7
A 将类的实现分散到多个不同文件或多个不同框架中。

B 创建对私有方法的前向引用。

C 向对象添加非正式协议。 继承可以增加,修改或者删除方法。

D 不能添加属性

39、对NSOperationQueue理解不正确的是 D

1
2
3
4
5
6
7
A 存放NSOperation的集合类

B 可以设置最大并发数

C 放进去的线程会自动执行

D 用户需要管理放进去的线程执行顺序

声明

  • 本文面试题收集自网络,解答依个人看法,如有偏颇,欢迎留言指正!

联系与捐赠

  • Mail: echo bGVvZGF4aWFAZ21haWwuY29tCg== | base64 -D
  • GitHub: iTofu
  • 如果你想对我的开发或是开源项目进行支持捐助,请扫描下方二维码,谢谢!👇

    Alipay

🍭 支持一根棒棒糖!