开门见山,这篇文章,适合「中高级iOS开发」,若是你如今待业,或者想跳槽而且还在求职的话,能够看看本文,找一找灵感,但愿对大家有帮助。html
2020年注定是一个特殊且不平凡的一年。*node
疫情之下,内忧外患,部分企业,倒下的倒下,扣薪的扣薪……,在这样的大环境之下,便是危机也是机会,毅然决定踏上求职之路。ios
起初自信满满,在没有作好充分准备状况之下,简历寥寥草草,简简单单,以致于错失很多好机会。切记切记!吃一堑长一智。面试
最后经过优化精简排版简历,接到很多互联网大厂的邀约面试。事实证实,拥有一份好简历,你已经成功一半了。最终,经过两个月的艰苦奋战,终于拿到本身比较满意的offer。为了作个总结,特开此篇,仅供参考~算法
个人感觉就是,本身一边梳理知识点,一边总结概括,收获可能更大,因此打算把我梳理的部分分享出来,篇幅有点长,你们见谅。sql
覆盖的点不是很全,分享给大家,但愿大家在金九银十的招聘季一切顺利,offer收割机❤️❤️❤️编程
坐标:深圳,面试公司数:约15家, offer:到手的有2两个,还有2家也进入谈薪阶段,谈完后就一直没下文了,表示很郁闷。 面试方式:大部分采用远程视频面试,极少现场面试。面试特色:一轮iOS技术面(OC基础+OC底层+算法), 二轮普遍技术面(网络工程+数据结构+算法)+HR面。整体感觉,今年面试最大特色是,首先.机会比往年少不少,iOS招聘需求主要集中在3-5年工做经验(换句话就是说岗位薪资20k广泛是上限,固然大厂除外),其次. 技术方面:OC底层已经是必须掌握,Swift极少被提到。json
做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个个人iOS交流群:413038000,无论你是大牛仍是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 你们一块儿交流学习成长!设计模式
iOS中常NSTimer、CADisplayLink、GCD定时器,其中NSTimer、CADisplayLink基于NSRunLoop实现,故存在偏差,GCD定时器只依赖系统内核,相对一前二者是比较准时的。数组
偏差缘由是:与NSRunLoop机制有关, 由于RunLoop每跑完一次圈再去检查当前累计时间是否已经达到定时设置的间隔时间,若是未达到,RunLoop将进入下一轮任务,待任务结束以后再去检查当前累计时间,而此时的累计时间可能已经超过了定时器的间隔时间,故会存在偏差。
参考《iOS常见三种定时器-NSTimer、CADisplayLink、GCD定时器》
若是直接使用,会产生循环引用问题。能够增长一个中间类,给这个类添加一个用weak修饰的id 类型target属性,并重写中间类的消息转发方法。实现以下代码:
声明文件.h:
#import <Foundation/Foundation.h> @interface LXProxy : NSProxy + (instancetype)proxyWithTarget:(id)target; @end
实现文件.m
#import "LXProxy.h" @interface LXProxy () /** weak target*/ @property (nonatomic, weak) id target; @end @implementation LXProxy + (instancetype)proxyWithTarget:(id)target{ LXProxy *proxy = [LXProxy alloc]; proxy.target = target; return proxy; } - (NSMethodSignature *)methodSignatureForSelector:(SEL)sel{ return [self.target methodSignatureForSelector:sel]; } - (void)forwardInvocation:(NSInvocation *)invocation{ [invocation invokeWithTarget:self.target]; } @end
调用代码:
_timer = [NSTimer scheduledTimerWithTimeInterval:2 target:[LXProxy proxyWithTarget:self] selector:@selector(test) userInfo:nil repeats:YES];
runtime是OC动态语言的运行时机制,OC的方法调用最后都转成了runtime的objc_msgSend函数。
注:对于已经排序好的方法列表,采用二分查算法查找对应的执行函数,对应没有排序的列表,采用通常遍历方法查找对应执行函数。
由此可知, 实例方法(-方法)查找是沿着其superclass指针逐级父类查找,终于根类对象(root class)。而类方法(+方法)查找是沿着其superclass指针逐级父类(meta)查找,终于根类对象(root class),若是根类对象存在同名实例方法,则会调用同名实例方法
+initialize 方法,会在第一次初始化这个类以前被调用,咱们用它来初始化静态变量。+load 方法会在加载类的时候就被调用,也就是 ios 应用启动的时候,就会加载全部的类,就会调用每一个类的 +load 方法。initialize 方法相似一个懒加载,若是没有使用这个类,那么系统默认不会去调用这个方法,且默认只加载一次,且调用发生在 +init 方法以前。
调用最后参与编译的分类的test方法。缘由:Xcode在编译时根据buildPhases->Compile Sources里面的从上至下顺序编译的,经过压栈的方式将多个分类压栈,且根据后进先出的原则,后编译的会被先调用(插入顶部添加,即[methodLists insertObject:category_method atIndex:0]。因此objc_msgSend遍历方法列表查找SEL 对应的IMP时,会先找到最后参与编译的分类)当objc_msgSend找到方法并调用以后,结束传递消息,因此就造成了所谓的“覆盖”。
App冷启动优化方案博客很是之多,归纳总结大体以下:
7. 事件响应响应链是什么样的?touchbegin,button touch,手势的区别和联系?
8. 实际开发过程中,您使用到哪些设计模式?说说单例模式优缺点?苹果设计的类对象是否是单例模式?
9. 实际开发过程中,您使用到哪些多线程,GCD与NSOperationQueue有什么联系?
10. Runloop响应事件类型,经常使用几种mode类型,与GCD有什么联系?
11. 说说你对Block的理解,有几种类型的Block, Block在捕获自变量,局部静态变量,全局变量,全局静态变量有什么区别, 什么状况下要注意Block循环引用问题?
12. NSString属性,使用什么关键字修饰,使用copy和strong修饰,有什么区别?
13. 什么是引用计数,说说你对自动释放池的理解,它是何时释放的,为何用__weak修饰的变量所指向的对象在释放时会自动把变量指针置为nil?
1. HTTPS和HTTP有什么区别,HTTPS加密过程是什么样的,对称加密和非对称解密各有什么优缺点?
HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全
HTTPS协议的主要做用能够分为两种:一种是创建一个信息安全通道,来保证数据传输的安全;另外一种就是确认网站的真实性。
HTTP与HTTPS的区别,详细介绍
1.快慢双指针法,快指针一次走两步,慢指针一次走一步,若是有环必会相遇
public class ListNode { public var val: Int public var next: ListNode? public init(_ val: Int) { self.val = val self.next = nil } } func validedCycleNoded(_ node: ListNode?) -> Bool { if node == nil { return false } var fast = node, slow = node while fast != nil { fast = fast?.next?.next slow = slow?.next if fast?.val == slow?.val { return true } } return false }
递归算法
/** * Definition for a binary tree node. * public class TreeNode { * public var val: Int * public var left: TreeNode? * public var right: TreeNode? * public init(_ val: Int) { * self.val = val * self.left = nil * self.right = nil * } * } */ class Solution { func maxDepth(_ root: TreeNode?) -> Int { guard let root = root else {return 0;} return max(maxDepth(root.left), maxDepth(root.right)) + 1 } }
func mergeSortedArray(_ a: [Int], b:[Int]) ->[Int] { var i = 0 var j = 0 var ans = [Int]() //合并数组 while i < a.count && j < b.count { if a[i] > b[j] { ans.append(b[j]) j += 1 }else if (a[i] == b[j]) { ans.append(b[j]) j += 1 i += 1 }else { ans.append(a[i]) i += 1 } } //数组a有未合并元素 while i < a.count { ans.append(a[i]) i += 1 } //数组b有未合并元素 while j < b.count { ans.append(b[j]) j += 1 } return ans }
LeeCode-72.编辑距离
解法:动态规划
class Solution { func isValid(_ s: String) -> Bool { if s.isEmpty { return true; } let map = ["}":"{", ")":"(","]":"["] var stack = [String]() for c in s { let key = String(c) if key == "{" || key == "(" || key == "[" { stack.append(key) } else if !stack.isEmpty && map[key] == stack.last { stack.removeLast() } else { return false } } return stack.isEmpty } } 复制代码
至少跑7场,
1只老鼠能够判定2瓶液体,2^3=8,因此须要3只老鼠便可,
对液体进行编号,001,010,011,100,101,110,111
给1号老鼠喂编码个位数上是1的液体(001,011,101,111),
给2号老鼠喂编码十位数上是1的液体(010,011,110,111),
给3号老鼠喂编码百位数上是1的液体(100,101,110,111),
1小时后,
若是老鼠全活, 8号液体有毒,
若是全都死,7号液体有毒,
若是1号死,2,3活, 1号液体有毒
若是2号死, 1,3活,2号液体有毒
若是3号死,1,2活, 4号液体有毒
若是1,2号死,3活, 3号液体有毒
若是1,3号死,2活, 5号液体有毒
若是2,3号死,1活, 6号液体有毒
struct Node { char a; int b; } node;
结构体大小是8,考察结构体特性,内存对齐原则。
<=20,线程安全问题。
select * from user where 入职时间<201806 and (离职时间 is null or离职时间>201803)。
因为时间关系,后面慢慢完善面试题答案。最后借用《三十而已》电视剧的台词做为结尾:“以上就是我面试遇到的故事,未完待续~~~”
做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个个人iOS交流群:413038000,无论你是大牛仍是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 你们一块儿交流学习成长!
做者:Xcode_boy
连接:https://juejin.im/post/6862898534857834510 来源:掘金