第一次电话面试

按照顺序打印 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
      }
      
      
      
  • 组件化的优劣

下载100张大图进行组合

  • 队列组
  • NSOperationQueue线程依赖

单例的销毁

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

工厂模式的实际应用

内存泄漏怎么检查

  • 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/6904834156740657159