第一次电话面试
依照程序打印 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...