美文网首页
iOS知识点

iOS知识点

作者: MoneyRobber | 来源:发表于2020-08-27 11:31 被阅读0次

    ui相关

    • uitableviewcell复用机制
      比如tableview向上滚动,当顶部的cell划出屏幕,cell就会被加入复用池,当顶部的cell要出现在屏幕上的时候,调用cell的dequeueReusableCellWithIdentifier方法,去复用池拿一个cell,如果能拿到就使用这个cell,如果返回nil,就创建一个新cell使用

    • uiview calayer区别
      uiview提供内容,负责处理触摸事件,参与响应链
      calayer负责显示内容,动画

    • 触摸事件传递机制&响应
      找到hittestview
      UIWindow->subView

    - (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        if (self.userInteractionEnabled == NO || self.alpha < 0.01 || self.hidden == YES)
        {
            return nil;
        }
        
        if ([self pointInside:point withEvent:event])
        {
            __block UIView *hitView;
            [self.subviews enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                CGPoint covertPoint = [self convertPoint:point toView:obj];
                hitView = [obj hitTest:covertPoint withEvent:event];
                *stop = YES;
            }];
            if (hitView) {
                return hitView;
            }
            return self;
        }
        return nil;
    }
    

    事件响应链
    subview -> superview -> ViewController.view -> ViewController -> UIWindow -> UIApplication
    事件按照上面的链条传递,如果到UIApplication还没有被处理就被丢弃

    • UI卡顿掉帧的原因&优化的方案
      在1/60 s内cpu和gpu没有准备好一帧的画面,会造成卡顿
      cpu:预排版(布局计算,文本计算),预渲染(图片的解压缩)
      gpu:避免离屏渲染,避免半透明图层的混合

    • 图片的解压缩
      从网络下载的,硬盘读取的jpg/png格式的图片都是压缩过的,需要解压缩,直接调用imageView.image = myImage,系统会自动解压缩,在主线程进行,解压缩操作耗时,可以把解压缩放到子线程进行,通过CGBitmapContextCreate等api创建解压缩后的image称为位图,优化卡顿

    • 离屏渲染
      gpu在当前屏幕缓冲区以外新开辟一个屏幕缓冲区进行渲染操作
      圆角(markToBounds),阴影(shadow),蒙版(mask),光栅化会引起gpu的离屏渲染
      要尽量避免gpu的离屏渲染,离屏渲染会创建新的缓冲区,上下文切换,会增加gpu渲染的时间,可能引起cpu+gpu在1/60 s内不能绘制一帧图像,引起卡顿

    oc语言相关

    • 怎样为catogory添加成员变量
      使用关联对象
    • catogory和extension的区别
      catogory运行时决定,extension编译时决定
      系统类可以添加catogory,不能添加extension
    • 代理和通知的区别
      通知是使用观察者模式实现的,代理使用的是代理模式实现的
      通知是一对多,代理是一对一
    • kvo是什么
      kvo是系统对观察者模式的一个实现
      oc使用了isa-swizzing实现了kvo
    • kvo的怎样使用isa-swizzing


    • kvc - (id)valueForKey:(NSString *)key 调用流程


    • kvc - (void)setValue:(id)value forKey:(NSString *)key 调用流程


    • assign,weak区别
      assign能修饰基本类型和对象,weak只能修饰对象
      assign指向的对象被释放后,指针仍然指向原内存地址,weak指向的对象被释放后,指针被置为nil
    • copy关键字


    runtime

    • 类对象和元类对象的区别
      类对象存储实例方法,元对象存储类方法
      对象的isa指针指向类对象,类对象的isa指针指向元类对象
    • 对象,类对象,元类对象图示


    • oc的消息传递机制


    • 消息转发图示


    • dynamic
      属性的getter,setter方法由用户自己实现
    • runtime如何通过sel找到对应的imp
      消息的传递机制
    • 内存的管理方案
      oc使用散列表来管理内存,散列表分为引用计数表,弱引用表
    • mrc和arc的区别
      mrc是手动管理内存,arc是编译器帮你管理内存
    • 什么是自动释放池
      是以栈为节点,通过双向链表组合而成
      是和线程一一对应的
      runloop Entry时调用_objc_autoreleasePoolPush创建自动释放池
      runloop BeforeWaiting调用_objc_autoreleasePoolPop(), _objc_autoreleasePoolPush,释放旧的池并创建新的池
      AutoreleasePool多层嵌套就是多次插入哨兵对象,一次AutoreleasePoolPage:: pop()就是从栈顶到哨兵的位置的所有对象发送一次release消息
      在for循环alloc图片等内存消耗较大的场景需要手动插入AutoreleasePool
    • [obj autorelease]图示


    • AutoreleasePoolPage图示


    • 怎么避免循环引用
      __weak 对象释放后,指针变为nil
      __unsafe__unretain 对象释放后,指针变为悬垂指针

    block

    • block是什么
      block是将函数及其上下文封装起来的对象
    • block的变量截获是怎样的
      对基本类型的局部变量截获其值
      对对象类型的局部变量连同所有权修饰符一起截获
      全局变量,静态局部变量不截获
    • __block
      对被截获变量就行赋值操作的话,需要添加__block
      __block修饰的基本类型变量变成了对象
    • block的copy操作
      StackBlock执行copy,copy到堆上
      GlobalBlock执行copy,什么也不做
      MallocBlock执行copy,增加引用计数

    多线程

    • 用gcd实现多读单写
      dispatch_barrier_async(concurrent_queue,^{//写操作})

    • 使用gcd实现这个需求,a,b,c三个并发任务,完成后执行任务d
      dispatch_group_async()

    • NSOperation,NSOperationQueue优缺点
      添加任务依赖
      [NSOperation addDependency]
      任务执行状态控制
      [NSOperation cancel],NSOperationQueue.suspended
      设置最大并发量
      [NSOperationQueue maxConcurrentOperationCount]

    • iOS中都有哪些锁
      @synchronized
      atomic
      OSSpinLock
      NSRecurSiveLock
      NSLock
      dispatch_semaphore_t

    • 自旋锁,互斥锁的区别
      自旋锁,和互斥锁类似,都是为了保证线程安全的锁。但二者的区别是不一样的,对于互斥锁,当一个线程获得这个锁之后,其他想要获得此锁的线程将会被阻塞,直到该锁被释放。但自旋锁不一样,当一个线程获得锁之后,其他线程将会一直循环在哪里查看是否该锁被释放。所以,此锁比较适用于锁的持有者保存时间较短的情况下

    • 信号量
      dispatch_semaphore_create 创建一个信号量,初始值传0,一般用来做线程同步
      dispatch_semaphore_wait 使信号量-1,如果信号量小于0,函数等待信号出现才返回
      dispatch_semaphore_signal 使信号量+1,如果之前的信号量小于0,唤醒dispatch_semaphore_wait

    runloop

    • 什么是runloop
      runloop是内部维护的消息循环来管理消息的一个对象,没有消息的时候休眠避免资源占用(用户态切换到内核态),有消息处理的时候被唤醒(内核态切换到用户态)
    • runloop和线程有什么关系
      一一对应
    • NSRunLoop的Mode


    • NSRunLoopCommonModes
      不是实际存在的一种mode
      是同步source,timer,observer到多个modes的一种技术方案
    • RunLoop的消息循环


    • 实现一个常驻线程


      afnetworking相关代码

    网络

    UDP&TCP
    https://github.com/CyC2018/CS-Notes/blob/master/notes/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%20-%20%E4%BC%A0%E8%BE%93%E5%B1%82.md

    • tcp的特点
      面向连接,可靠传输,流量控制,拥堵控制
    • tcp为啥是三次握手
      https://www.zhihu.com/question/24853633
    • tcp为啥是四次挥手
      tcp是全双工,比如先关闭客户端到服务器的通道,再关闭服务器到客户端的通道,每次一端的关闭都需要另一端的确认,所以需要四次挥手
    • get post区别
      get的数据拼在url后面,post的参数放在body里面
      get的数据长度有限制,post没有
    • http的特点
      无状态
    • https
      https = http + ssl/tls


    • DNS解析


    • cookie & session


    设计模式

    • 设计原则
      1.单一职责原则
      2.开闭原则
      对修改关闭,对扩展开放
      3.接口隔离原则
      使用多个专门的协议,而不是一个庞大的协议
      4.依赖倒置原则
      抽象不应依赖具体实现,具体实现依赖抽象
      5.里氏替换原则
      父类可以被子类替换,原有功能不受影响
    • 桥接模式
      桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化,采用组合的方式实现,例如BaseA,BaseB(均为抽象类), BaseB是BaseA的一个变量,BaseA,BaseB通过各自的子类实现
    • 单例模式
    + (instancetype)sharedInstance {
        static id _instance;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _instance = [[SomeClass alloc] init];
        });
        return _instance;
    }
    
    • 责任链模式
    • 代理模式
    • 通知模式
    • 适配器模式



    相关文章

      网友评论

          本文标题:iOS知识点

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