单选题
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、delegate中的property使用以下哪个属性()
A、assign
B、retain
C、copy
D、strong
2、A
delegate中文叫做委托,通常会用在class内部把一些事件处理"委托"给别人去完成。
为什么我们不用retain而要用assign呢?
原因就是在于iOS的reference counting的环境中,我们必须解决circular count的问题。
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、关于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、下面关于线程管理错误的是()
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、在没有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、下面对category描述不正确的是()
A、category可以添加新的方法
B、category可以删除修改之前的方法
C、将类的实现分散到多个不同文件或多个不同框架中
D、创建对私有方法的前向引用
7、B
类别是一种为现有的类添加新方法的方式。利用Objective-C的动态运行时分配机制,Category提供了一种比继承(inheritance)更为简洁的方法来对class进行扩展,无需创建对象类的子类就能为现有的类添加新方法,可以为任何已经存在的 class 添加方法,包括那些没有源代码的类(如某些框架类),但不能删除修改之前的方法。
类别主要有3个作用:
(1)可以将类的实现分散 到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。
(2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告
(3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。
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、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的中。