美文网首页面试
iOS 微博面试题

iOS 微博面试题

作者: 姜流儿96 | 来源:发表于2018-10-25 09:40 被阅读20次

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

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

    相关文章

      网友评论

        本文标题:iOS 微博面试题

        本文链接:https://www.haomeiwen.com/subject/wlfbwftx.html