乐趣区

关于ios:iOS面试经历希望对大家有所帮助

第一次电话面试

依照程序打印 1 到 100 不少于一个线程

        // 全局变量
        var   lock = os_unfair_lock()

        DispatchQueue.global().async {self.action()
        }
        DispatchQueue.global().async {self.action()
        }
        // 具体打印
    func action(){

        while true {os_unfair_lock_lock(&lock)

            if num >= 100{os_unfair_lock_unlock(&lock)
                return
            }
            num += 1

            print("\(num)----\(Thread.current)")

            os_unfair_lock_unlock(&lock)

        }

    }

全局并发队列打印 1 到 10000 最终后果

  • 会多于 10000 因为会同时拿到 num 值 进行加一

MVVM view 和 viewmodel 和 model 的关系

  • viewModel 持有 model view 持有 viewModel 使 view 和 model 实现双向绑定

不必 RAC 怎么实现 MVVM

  • 利用 KVO 实现双向绑定

UIView.animate.during 监听 alpha 0 到 1 的变动

       let normalView = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        normalView.backgroundColor = UIColor.red
        normalView.alpha = 0
        view.addSubview(normalView)

        let timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) {(time) in
            let layer = normalView.layer.presentation()

            print(layer?.opacity)
        }
        RunLoop.current.add(timer, forMode: RunLoopMode.commonModes)
        UIView.animate(withDuration: 2) {normalView.alpha = 1}

setNeedlayout layouSubViews 等

这里有一个 iOS 交换圈:891 488 181 能够来理解,分享 BAT, 阿里面试题、面试教训,探讨技术,裙里材料间接下载就行,大家一起交流学习!

  • layouSubViews 的调用机会

    • init 初始化不会触发 layoutSubviews。
    • addSubview 会触发 layoutSubviews(后面 init 如果设置 frame 的话会调用两次,如果没有 设置 frame 就调用一次)
    • 设置 view 的 Frame 会触发 layoutSubviews,(当然前提是 frame 的值设置前后产生了变动。单单设置 x 值的变动是不会调的,但设置 y 值是会变的,奇怪)
    • 滚动一个 UIScrollView 会触发 layoutSubviews。
    • 旋转屏幕会触发父 UIView 上的 layoutSubviews 事件。(这个咱们开发中会常常遇到,比方屏幕旋转时,为了界面好看咱们须要批改子 view 的 frame,那就会在 layoutSubview 中做相应的操作)
    • 扭转一个 UIView 大小的时候也会触发父 UIView 上的 layoutSubviews 事件
    • 间接调用 setLayoutSubviews。(Apple 是不倡议这么做的)
  • drawRect 调用机会

    • 如果在 UIView 初始化时没有设置 rect 大小,将间接导致 drawRect 不被主动调用。drawRect 掉用是在 Controller->loadView, Controller->viewDidLoad 两办法之后掉用的. 所以不必放心在 控制器中, 这些 View 的 drawRect 就开始画了. 这样能够在控制器中设置一些值给 View(如果这些 View draw 的时候须要用到某些变量值).
    • 该办法在调用 sizeToFit 后被调用,所以能够先调用 sizeToFit 计算出 size。而后零碎主动调用 drawRect: 办法。
    • 通过设置 contentMode 属性值为 UIViewContentModeRedraw。那么将在每次设置或更改 frame 的时候主动调用 drawRect:。
    • 间接调用 setNeedsDisplay,或者 setNeedsDisplayInRect: 触发 drawRect:,然而有个前提条件是 rect 不能为 0。

组件化间传值 组件化计划优劣

  • 传值总的来说 前向传值就是间接传,反向传值用 block 等

    • MGJRouter

      //MGJRouter
      // 前向
      [MGJRouter openURL:@"MGJ://Test2/PushMainVC" withUserInfo:@{@"navigationVC":self.navigationController,@"text":@"前向传值"} completion:nil];
      // 反向
      [MGJRouter openURL:@"MGJ://Test3/PushMainVC"      withUserInfo:@{@"navigationVC":self.navigationController,
                      @"block":^(NSString *text){NSLog(@"%@",text);
                     }} completion:nil];
    
    *   CTMediator
    
     @objc public func A_showSwift(param:[AnyHashable:Any], callback:@escaping (String) -> Void) -> UIViewController? {
       var params = param// 前向
       params["callback"] = callback// 反向
       params[kCTMediatorParamsKeySwiftTargetModuleName] = "DYLCWithDrawKit"
    
       if let viewController = self.performTarget("DYLCWithDrawKit", action: "Extension_ViewController", params: params, shouldCacheTarget: false) as? UIViewController {return viewController}
       return nil
    }
    
        @objc func Action_Extension_ViewController(_ params:NSDictionary) -> UIViewController {let  num =   params["keggg"]// 前向
       let aViewController = SHWithDrawHomeViewController()
       aViewController.num = num as! Int// 前向
       aViewController.callBack = {(str) in
           if let callback = params["callback"] as? (String) -> Void {callback(str)// 反向
           }
       }
       return aViewController
    }
    
    
    ```
    
  • 组件化的优劣

    • iOS 组件化计划比照

下载 100 张大图进行组合

  • 队列组
  • NSOperationQueue 线程依赖

单例的销毁

  • 代码中有一个 onceToken 变量, 在单例生成之前 onceToken = 0, 在单例生成之后 onceToken = - 1 了, 之后始终放弃 - 1 这个值, 销毁的时候把单例类置为 nil 同时把 onceToken 置为 0

工厂模式的理论利用

  • iOS 工厂模式理论利用

内存透露怎么查看

  • MFinderLeaks,instrement 动静查看,动态剖析

从输出 url 到页面展现到底产生了什么

  • 1、输出地址
  • 2、浏览器查找域名的 IP 地址
  • 3、浏览器向 web 服务器发送一个 HTTP 申请
  • 4、服务器的永恒重定向响应
  • 5、浏览器跟踪重定向地址
  • 6、服务器解决申请
  • 7、服务器返回一个 HTTP 响应
  • 8、浏览器显示 HTML
  • 9、浏览器发送申请获取嵌入在 HTML 中的资源(如图片、音频、视频、CSS、JS 等等)

有想要支付收费材料的能够进裙或者加好友支付,这里有一个 iOS 交换圈:891 488 181 能够来理解,分享 BAT, 阿里面试题、面试教训,探讨技术,裙里材料间接下载就行,大家一起交流学习!

有想要的面试材料或者其余材料也能够找我,欢送征询!须要的可自行下载




文章到这里就完结了,你也能够私信我及时获取面试相干材料。如果你有什么意见和倡议欢送给我留言。

作者:Mikebanana
链接:https://juejin.cn/post/690483…

退出移动版