Tips
OC 中 id 和 instancetype 的区别
- id 在编译器不能判断出对象的真实类型;instancetype 则可以,所以如果在init方法返回类型为 instancetype ,将它赋值给其他类型时,会有警告
- id 可以作为返回值类型、可以声明变量、可以作为形参;instancetype只能作为返回值使用
Receive
Flutter的事件队列
Flutter默认是单线程任务处理的,如果不开启新的线程,任务默认在主线程中处理。
和iOS应用很像,在Dart的线程中也存在事件循环和消息队列的概念,但在Dart中线程叫做isolate。应用程序启动后,开始执行main函数并运行main isolate。
每个isolate包含一个事件循环以及两个事件队列,event loop事件循环,以及event queue和microtask queue事件队列,event和microtask队列有点类似iOS的source0和source1。
-
event queue:负责处理I/O事件、绘制事件、手势事件、接收其他
isolate消息等外部事件。 -
microtask queue:可以自己向
isolate内部添加事件,事件的优先级比event queue高。
这两个队列也是有优先级的,当isolate开始执行后,会先处理microtask的事件,当microtask队列中没有事件后,才会处理event队列中的事件,并按照这个顺序反复执行。但需要注意的是,当执行microtask事件时,会阻塞event队列的事件执行,这样就会导致渲染、手势响应等event事件响应延时。为了保证渲染和手势响应,应该尽量将耗时操作放在event队列中。
Algorithm
二叉树的中序遍历
思路:利用栈先进后出的特性,将根节点赋值为当前节点
1、如果当前节点有左子树,则将当前节点入栈。将当前节点赋值为左子树,当前节点不为空,重复1,否则进入2
2、栈为空时,程序结束;否则将栈顶节点出栈,并打印。将当前节点赋值为右子树,当前节点不为空,重复1,否则重复2
/**
* 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 inorderTraversal(_ root: TreeNode?) -> [Int] {
if root == nil {
return []
}
var result: [Int] = []
var node: TreeNode? = root
var stack: [TreeNode?] = []
while stack.count > 0 || node != nil {
if node != nil {
stack.append(node)
node = node?.left
} else {
node = stack.last as? TreeNode
result.append(node!.val)
stack.removeLast()
node = node?.right
}
}
return result
}
}