写点什么

ARTS 打卡 Week 05

用户头像
teoking
关注
发布于: 2020 年 06 月 28 日
ARTS 打卡 Week 05

每周完成一个 ARTS:

Algorithm: 每周至少做一个 LeetCode 的算法题

Review: 阅读并点评至少一篇英文技术文章

Tips: 学习至少一个技术技巧

Share: 分享一篇有观点和思考的技术文章



Algorithm

LC 94: 二叉树的中序遍历

public class BinaryTreeInorderTraversal {
// 递归解法
// Runtime: O(n)
// Space: O(n)
static class RecursionSolution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
traverse(root, ans);
return ans;
}
void traverse(TreeNode root, List<Integer> ans) {
if (root == null) {
return;
}
traverse(root.left, ans);
ans.add(root.val);
traverse(root.right, ans);
}
}
// 循环遍历解法
// Runtime: O(n)
// Space: O(n)
static class IteratorSolution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
// left node进栈
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
// Visit node
cur = stack.pop();
ans.add(cur.val);
// iterate right node
cur = cur.right;
}
return ans;
}
}
}



Review

Weak, Soft, and Phantom References in Java (and Why They Matter)

为什么要有这些引用类型?

GC是发明用来简化手动内存管理的;引用类型是语言释放出的接口,让开发者与其GC“协作”的。

不同引用类型定义:

  • Strong Reference: 只要强引用还存在,GC永远不会回收被引用的对象。

  • SoftReference: 软引用用来描述一些还有用但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出之前,将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。

  • WeakReference: 弱引用也是用来描述非必需对象的,但是它的强度比软引用更弱一些,被弱引用关联的对象只能生存在下一次垃圾收集发生之前。当GC工作时,无论当前内存是否足够,都会回收只被弱引用关联的对象。

  • PhantomReference: 幽灵引用是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来获得一个对象实例。为一个对象设置虚引用关联的唯一目的就是能在对象呗GC回收时收到一个系统通知。

引用类型的使用场景:

  • SoftReference

  • 实现内存cache

  • SoftHashMap: map的k-v映射通过SoftReference实现

  • WeakReference

  • WeakHashMap

  • 引用大对象,比如Android中的context对象

  • PhantomReference

  • 监控内存泄露,如LeakDetector



Android Libcore中对SoftReference的测试case之一,就是构造一个OOM,然后再去判断引用的对象是否为null。



Tips

使用Mermaid绘制流程图



Share

最近在进行iOS开发时,碰到一个奇怪的问题:明明给某个controller的weak property赋值了,但是这个property在用的时候确是nil,改成strong的话就没有问题。

打断点跟了一下,发现原来是我在一个函数内部创建了property对象,并赋值给controller,当方法结束时,这个property因为是方法局部变量且没有对它的强引用,因此被回收掉了。

- (void)foo {
SomeDelegate *delegate = [[SomeDelegate alloc]init];
self.viewController.delegate = delegate;
}

同样的情况,在Java中是不会回收的(当然Java默认是强引用)。写这段代码时,我确实有点“Java思维”了。



用户头像

teoking

关注

Monkey plays software. 2018.11.28 加入

程序员。目前主要从事Android和iOS开发。

评论 (2 条评论)

发布
用户头像
你这文章插图都好漂亮 是怎么获取的呐 😂
2020 年 06 月 29 日 18:29
回复
文章插图都授权自:元圆w (https://weibo.com/sissiw2015)
2020 年 07 月 05 日 09:59
回复
没有更多了
ARTS 打卡 Week 05