群里搜集,整理一下,侵删。
一、 选择题
1、 定义协议时,在协议名称后加上<NSOb ject>的作用是:
A.新定义的协议遵守<NSObject>协议。
B.新定义的协议是<NSOb ject>协议的子协议。
C.遵守新定义的协议的对象,也必须遵守<NSOb ject>协议。
D. 遵守新定义的协议的对象,必须是NSObject的子类。
2、 以下代码存在的问题是:
dispatch_queue_t queue = dispatch_queue_create("com.apple.www", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(actionTime:) userInfo:nil repeats:YES];
});
- (void)actionTime:(NSTimer *)timer {
NSLog(@"---- %@",[NSDate date]);
}
A.运行时崩溃
B.死锁
C.定时器不执行
D.定时器只执行一-次
3、 以下哪些情况容易造成循环引用?
A. dispatch async 的block 中使用self
B.使用strong 修饰delegate 属性
C. self作为NSNotificationCenter 的observer
D. self作为所持有的NSTimer 的target
4、以下哪些类跟UIView有继承关系(直接、间接的父类或子类) ?
A. UIControl
B. UIGestureRecognizer
C. CALayer
D. UIResponder
5 、下列关于OC消息机制说法不正确的是?
A、OC的实例对象的isa指针指向它的类对象,类对象的isa指针指向它的元类对象
B、OC的调用一个未实现的实例方法,我们可以在NSObject的resolveClassMethod中进行添加方法进行补救
C、OC可以运用运行时特性向Class的对象中动态添加方法
D、OC的实例方法是存放在相应实例对象的methodlist中,静态方法存在相应的类对象的methodlist中的
E、OC可以运用运行时特性向对象的Category中实现动态绑定属性,达到category添加成员变量的效果
F、OC可以运用运行时特性通过class_ addIvar ()向编译好的Class添加成员变量
6、在HTTP请求中,返回代码401和500代表下列哪两种状态
A:请求网页不存在
B:未授权
C:服务器内部错误
D禁止访问
7、以下代码输出的日志是
dispatch_sync(dispatch_get_main_queue(), ^{
printf("1");
});
printf("2");
A. 12
B. 21
C.1
D.2
E. 无输出
8、在开发过程中,block的使用很容易造成内存泄漏,对于下面代码会不会造成内存问题? 需要如何处理?
[UIView animateWithDuration:0.25 animations:^{
self.alpha = 0;
}];
A.会造成内存问题
B. 不会造成内存问题
会的话, 要如何处理_______
9、以下代码第二行编译不通过,修改不正确的是。
NSError * error = nil;
NSError ** plError = &error;
A.__strong NSError ** pError = &error;
B.NSError __strong ** pError = &error ;
C.NSError * __strong * pError = &error;
D. NSError ** __strong pError = &error;
10、runloop Observer 可以监听的事件为:
A、进入runloop和退出runloop
B 、执行完timer 事件
C、执行source事件之前和执行完source事件
D、等待前和唤醒后
参考答案(仅供参考,如有误请指正)
1、A、C
2、C 解析:平时用定时器的时候 用scheduledTimerWithTimeInterval这个方法创建 实际上做了两个操作 一个是创建了定时器 另一个是把创建完的定时器 放到runloop里 而且都是在主线程创建 默认主线程的runloop是开启的 所以不用管 但是到了子线程里 runloop不会默认开启 所以要手动开启runloop 才能启动定时器
3、B、D
4、A、D
5、B、D、F
6、B、C
7、E 解析:死锁
dispatch_sync在等待block语句执行完成,而block语句需要在主线程里执行,所以dispatch_sync如果在主线程调用就会造成死锁
dispatch_sync是同步的,本身就会阻塞当前线程,也即主线程。而又往主线程里塞进去一个block,所以就会发生死锁。
8、B PS:感觉是个坑。如果有误,请不吝赐教
9、D
10、A、D
// 1. 创建监听者
/**
* 创建监听者
*
* @param allocator#> 分配存储空间
* @param activities#> 要监听的状态
* @param repeats#> 是否持续监听
* @param order#> 优先级, 默认为0
* @param observer 观察者
* @param activity 监听回调的当前状态
*/
CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(kCFAllocatorDefault, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
/*
kCFRunLoopEntry = (1UL << 0), 进入工作
kCFRunLoopBeforeTimers = (1UL << 1), 即将处理Timers事件
kCFRunLoopBeforeSources = (1UL << 2), 即将处理Source事件
kCFRunLoopBeforeWaiting = (1UL << 5), 即将休眠
kCFRunLoopAfterWaiting = (1UL << 6), 被唤醒
kCFRunLoopExit = (1UL << 7), 退出RunLoop
kCFRunLoopAllActivities = 0x0FFFFFFFU 监听所有事件
*/
switch (activity) {
case kCFRunLoopEntry:
NSLog(@"进入");
break;
case kCFRunLoopBeforeTimers:
NSLog(@"即将处理Timer事件");
break;
case kCFRunLoopBeforeSources:
NSLog(@"即将处理Source事件");
break;
case kCFRunLoopBeforeWaiting:
NSLog(@"即将休眠");
break;
case kCFRunLoopAfterWaiting:
NSLog(@"被唤醒");
break;
case kCFRunLoopExit:
NSLog(@"退出RunLoop");
break;
default:
break;
}
});
// 2. 添加监听者
/**
* 给指定的RunLoop添加监听者
*
* @param rl#> 要添加监听者的RunLoop
* @param observer#> 监听者对象
* @param mode#> RunLoop的运行模式, 填写默认模式即可
*/
CFRunLoopAddObserver(CFRunLoopGetCurrent(), observer, kCFRunLoopDefaultMode);