TRA - 1

127 阅读2分钟

Tips

OC 中 id 和 instancetype 的区别

  • id 在编译器不能判断出对象的真实类型;instancetype 则可以,所以如果在init方法返回类型为 instancetype ,将它赋值给其他类型时,会有警告
  • id 可以作为返回值类型、可以声明变量、可以作为形参;instancetype只能作为返回值使用

Receive

Flutter的事件队列

Flutter默认是单线程任务处理的,如果不开启新的线程,任务默认在主线程中处理。

和iOS应用很像,在Dart的线程中也存在事件循环和消息队列的概念,但在Dart中线程叫做isolate。应用程序启动后,开始执行main函数并运行main isolate

每个isolate包含一个事件循环以及两个事件队列,event loop事件循环,以及event queuemicrotask queue事件队列,eventmicrotask队列有点类似iOS的source0source1

  • event queue:负责处理I/O事件、绘制事件、手势事件、接收其他isolate消息等外部事件。

  • microtask queue:可以自己向isolate内部添加事件,事件的优先级比event queue高。

640?wx_fmt=png

这两个队列也是有优先级的,当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
    }
}