搜狐 2021 iOS工 程师面试题

小编:管理员 1020阅读 2021.10.09

第1题:

 单选题

1、以下哪一段代码不会抛出异常()       

A、NSArray *array=@[1,2,3];NSNumber * number=array[3];

B、NSDictionary *dict=@{@"key":nil};

C、NSString *str=nil;NSString *str2=[str substringFromIndex:3];

D、NSString *str=@"hi";NSString *str2=[str substringFromIndex:3];



 1、C

A:OC数组中的元素不能是基本数据类型,必须是对象,并且array[3]下标越界,Xcode编译时报错

B:字典中键值对不能为nil,运行时崩溃

C:OC中向空对象发送消息,不执行任何操作,不报错,不崩溃

D:数组下标越界,运行时崩溃



第2题:

2、delegate中的property使用以下哪个属性()      

A、assign

B、retain

C、copy

D、strong



 2、A

delegate中文叫做委托,通常会用在class内部把一些事件处理"委托"给别人去完成。 

为什么我们不用retain而要用assign呢? 
原因就是在于iOS的reference  counting的环境中,我们必须解决circular count的问题。 



第3题:

 3、C和Objective-C的混合使用,以下描述错误的是()  

A、cpp文件只能使用C/C++代码

B、cpp文件include的头文件中,可以出现objective-C的代码

C、mm文件中混用cpp直接使用即可

D、cpp使用objective-C的关键是使用接口,而不能直接使用代码



 3、B  

obj-c 的编译器处理后缀为 m 的文件时,可以识别 obj-c 和 c 的代码,处理 mm 文件可以识别 obj-c,c,c++ 代码,但 cpp 文件必须只能用 c/c++ 代码,而且 cpp 文件 include 的头文件中,也不能出现 obj-c 的代码,因为 cpp 只是 cpp



第4题:

 4、关于Objective-C中属性的说明,以下错误的是()

A、readwrite是可读可写特性,需要生成getter方法和setter方法

B、readonly是只读特性,只有getter方法,没有setter方法

C、assign是赋值属性,setter方法将传入参数赋值给实例变量

D、retain表示持有特性,copy属性表示拷贝属性,都会建立一个相同的对象



 4、D

Copy是创建一个新对象,Retain是创建一个指针,引用对象计数加1。

        Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。

        Retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容相同,这个对象的retain值+1也就是说,retain 是指针拷贝,copy 是内容拷贝



第5题:

 5、下面关于线程管理错误的是()

A、GCD在后端管理着一个线程池

B、NSOperationQueue是对NSthread的更高层的封装

C、NSThread需要自己管理线程的生命周期

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



 5、B

B是错的,SOperationQueue是对GCD的更高层的封装
C是对的。
// 初始化线程
NSThread *thread = [[NSThread alloc] initWithTarget:self  selector:@selector(run) object:nil];
// 设置线程的优先级(0.0 -   1.0,1.0最高级)
thread.threadPriority = 1;
// 开启线程
[thread start];



第6题:

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

A、{self navigationController pushViewController:nextViewController animated:YES};

B、{self view addSubview:nextViewController.view};

C、{self presentModalViewController:nextViewController animated:YES};

D、{self pushViewController:nextViewController animated:YES};



 6、C

A是navigationController包裹下的控制器才使用的跳转,不符合题意

B是加载一个控制器的view,也是错的

C是IOS中的模态切换,符合题意,所以C是正确答案

D明显就是错误的 



第7题:

 7、下面对category描述不正确的是()        

A、category可以添加新的方法

B、category可以删除修改之前的方法

C、将类的实现分散到多个不同文件或多个不同框架中

D、创建对私有方法的前向引用



 7、B

类别是一种为现有的类添加新方法的方式。利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的   class   添加方法,包括那些没有源代码的类(如某些框架类),但不能删除修改之前的方法。

类别主要有3个作用:

(1)可以将类的实现分散     到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。

(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告

(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。



第8题:

 8、iOS中的数据持久化方式()

A、属性列表

B、对象归档

C、SQLite和CoreData

D、以上全部



 8、D

IOS中的数据持久化方式,基本上有以下四种:属性列表、对象归档、SQLite3和Core Data

属性列表
涉及到的主要类:NSUserDefaults,用于存储配置信息

SQLite:用于存储查询需求较多的数据

CoreData:用于规划应用中的对象,Core Data本质上是使用SQLite保存数据,但是它不需要编写任何SQL语句。

对象归档:使要使用对象归档,对象必须实现NSCoding协议.大部分Object C对象都符合NSCoding协议,也可以在自定义对象中实现NSCoding协议,用基本对象类型定制的个性化缓存方案



第9题:

 9、NSRunLoop的以下描述错误的是()       

A、Runloop并不是由系统自动控制的

B、有3类对象可以被run loop监控:sources,timers,observers

C、线程是默认启动run loop的

D、NSTimer可手动添加到新建的NSRunLoop中



 9、C

A:Runloop的作用在于当有事情要做时它使当前的thread工作,没有事情做时又使thread 休眠sleep。Runloop并不是由系统自动控制的,尤其是对那些新建的次线程需要对其进行显示的控制。

B:有3类对象可以被run  loop监控:sources、timers、observers。当这些对象需要处理的时候,为了接收回调,首先必须通过 CFRunLoopAddSource ,CFRunLoopAddTimer 或者 CFRunLoopAddObserver 把这些对象放入run  loop。 要停止接收它的回调,可以通过CFRunLoopRemoveSource从run loop中移除某个对象。 

C:每一个线程都有自己的runloop,   主线程是默认开启的,创建的子线程要手动开启,因为NSApplication 只启动main applicaiton thread。

D:NSTimer默认添加到当前NSRunLoop中,也可以手动制定添加到自己新建的NSRunLoop的中。


关联标签: