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