mirror of
https://github.com/NohamR/knowledge-kit.git
synced 2026-05-24 20:00:37 +00:00
feature: App 逆向防护
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
## CADisplayLink 内存泄漏
|
||||
|
||||
<img src="./../assets/CSDisplayLinkMemoryLeak.png" style="zoom:30%" />
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/CSDisplayLinkMemoryLeak.png" style="zoom:30%" />
|
||||
|
||||
可以看到 CADisplayLink 和 VC,VC 和 CADisplayLink 互相持有,造成内存泄漏,没有释放。即使页面离开,定时器还在继续运行,不断打印。
|
||||
|
||||
@@ -18,11 +18,11 @@ NSTimer 的基础 API `[NSTimer scheduledTimersWithTimeInterval:1 repeat:YES blo
|
||||
|
||||
Demo 如下:
|
||||
|
||||
<img src="./../assets/NSTimerMemoeryLeakDemo.png" style="zoom:30%" />
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/NSTimerMemoeryLeakDemo.png" style="zoom:30%" />
|
||||
|
||||
但是当使用 `[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerTask) userInfo:nil repeats:NO];` repeats 为 NO 的时候,好像不会内存泄漏。这是为什么?
|
||||
|
||||
<img src="./../assets/NSTimerMemoeryNotLeakWhenRepeatNO.png" style="zoom:30%" />
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/NSTimerMemoeryNotLeakWhenRepeatNO.png" style="zoom:30%" />
|
||||
|
||||
|
||||
|
||||
@@ -194,7 +194,7 @@ Demo 如下:
|
||||
|
||||
### 改用 block 的方式替换 API,不再持有 target
|
||||
|
||||
<img src="./../assets/NSTimerFixMemoryLeakIssueByBlockAPI.png" style="zoom:30%" />
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/NSTimerFixMemoryLeakIssueByBlockAPI.png" style="zoom:30%" />
|
||||
|
||||
该种方式,控制器 (self)强引用 timer,timer 强引用 block,block 弱引用 self,3者没有形成环。
|
||||
|
||||
@@ -202,7 +202,7 @@ Demo 如下:
|
||||
|
||||
### 采用系统 NSProxy 代替自定义的中间类
|
||||
|
||||
<img src="./../assets/NSTimerMemoryLeakFixedByNSProxy.png" style="zoom:30%" />
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/NSTimerMemoryLeakFixedByNSProxy.png" style="zoom:30%" />
|
||||
|
||||
注意:继承自 NSProxy 的类,不能 init。
|
||||
|
||||
@@ -218,7 +218,7 @@ QA:自己写的继承自 NSObject 的代理对象和继承自 NSProxy 的代
|
||||
|
||||
看一段神奇的代码
|
||||
|
||||
<img src="./../assets/NSProxyAndNSObjectMethodImpl.png" style="zoom:30%" />
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/NSProxyAndNSObjectMethodImpl.png" style="zoom:30%" />
|
||||
|
||||
为什么打印出 `0 1`?
|
||||
|
||||
@@ -260,7 +260,7 @@ QA:自己写的继承自 NSObject 的代理对象和继承自 NSProxy 的代
|
||||
|
||||
|
||||
|
||||
<img src="./../assets/RunLoop-SourceCode.png" style="zoom:30%" />
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/RunLoop-SourceCode.png" style="zoom:30%" />
|
||||
|
||||
假设一个 NSTimer 被加到 RunLoop 开头,NSTimer 执行周期为1s,RunLoop 前面任务繁重,第一次走完一个完整的 RunLoop 需要0.4s,然后从头检测 NSTimer 有没有到时间,发现还没到继续执行 RunLoop 后续逻辑。后面遇到卡顿任务了,第二次 RunLoop 用了0.5s,然后从头检测 NSTimer 有没有到时间,0.4+0.5还不到时间,继续跑,第三次 RunLoop 比较轻松,耗时0.2s,再判断定时器时间有没有到,则此次已经0.4+0.5+0.2=1.1s了,此时 NSTimer 的事件被执行,此时精确度已经不够了(每次 RunLoop 的执行时间不固定)
|
||||
|
||||
@@ -303,7 +303,7 @@ GCD timer 不依赖 RunLoop,系统底层驱动,所以会更加准确。因
|
||||
|
||||
### 打破循环引用,NSTimer target 自定义
|
||||
|
||||
<img src="./../assets/NSTimerMemoryLeakFixedByProxy.png" style="zoom:30%" />
|
||||
<img src="https://raw.githubusercontent.com/FantasticLBP/knowledge-kit/master/assets/NSTimerMemoryLeakFixedByProxy.png" style="zoom:30%" />
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user