面试

iOS 微博面试题

2018-10-25  本文已影响20人  姜流儿96

群里搜集,整理一下,侵删。

一、 选择题
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、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);
上一篇 下一篇

猜你喜欢

热点阅读