第一次电话面试

依照程序打印 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...