<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[yj_android_develop的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/yj_android_develop</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; yj_android_develop]]></copyright><item><title><![CDATA[C++内存模型]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/113833948</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/113833948</guid><author>yj_android_develop</author><pubDate>Wed, 17 Feb 2021 14:56:43 +0800</pubDate><description><![CDATA[C++内存分为5个区域：

栈（Stack）：
    栈的内存地址是连续的且被一一记录的。内存由编译器在需要时自动分配和释放。通常用来存储局部变量和函数参数。栈运算分配内置于处理器的指令集中，效率很高，但是分配的内存容量有限。在执行函数时，函数内局部变量的存储单元都可以在栈上创建，函数执行结束时这些存储单元自动被释放。堆（Heap ）：
    由new分配的内存块，其释放编译器不去管，由我们程序自己控制，一个new对应一个delete，或者一个new[] 对应一个delete[]。如果...]]></description><category></category></item><item><title><![CDATA[Android ScreenSaver分析]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/113377088</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/113377088</guid><author>yj_android_develop</author><pubDate>Sun, 31 Jan 2021 12:44:38 +0800</pubDate><description><![CDATA[Android屏保启动接口：

https://blog.youkuaiyun.com/szqsdq/article/details/74237967



https://blog.youkuaiyun.com/weixin_42695485/article/details/81462877





屏保提供了对外接口：

IDreamManager mDreamManager = IDreamManager.Stub.asInterface(ServiceManager.getService(DreamService....]]></description><category></category></item><item><title><![CDATA[Android Handler机制]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/112131393</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/112131393</guid><author>yj_android_develop</author><pubDate>Sun, 10 Jan 2021 18:56:00 +0800</pubDate><description><![CDATA[Android开发中经常用到handler来发送消息，比如将消息抛到主线程去更新UI。handler机制涉及到三个核心的类：

Looper：消息循环，不断从消息队列中取出消息；
	MessageQuenue：消息队列；
	Handler：管理消息队列；
    为了更好的理解这三者的关系，我们可以想象成现实生活中，工厂里边的一条流水线。有一个放产品（Message）的传送带（MessageQuenue），被机器带动起来不断循环运行（Looper），而工人（Handler）需要将产品...]]></description><category></category></item><item><title><![CDATA[Java锁机制]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/111874244</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/111874244</guid><author>yj_android_develop</author><pubDate>Thu, 31 Dec 2020 21:17:34 +0800</pubDate><description><![CDATA[Java锁主要是为了解决线程安全问题，当多个线程共享同一个变量时可能会出现同时修改变量的情况，这样会导致最终计算结果错误。未解决该问题，Java提供了各种锁来确保数据能够被正常修改和访问。最常用的比如synchronized。

一、互斥同步

    互斥同步是最常见的一种并发正确性保障手段，同步是指多个线程并发访问共享数据是，保证共享数据在同一个时刻只被一条线程使用。Java中，最基本的互斥同步手段就是synchronized关键字，该关键字经过编译之后，会在同步块的前后分别形成...]]></description><category></category></item><item><title><![CDATA[Java垃圾回收机制]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/111414093</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/111414093</guid><author>yj_android_develop</author><pubDate>Sun, 20 Dec 2020 14:32:16 +0800</pubDate><description><![CDATA[Java自动内存管理归结为内存分配和内存回收。内存回收有如下算法。

一、根搜索算法

原理：通过一系列名为“GC Roots的对象作为起点，从这些节点开始向下搜索，搜索所走过的路径称为引用链，当一个对象到GC Roots没有任何引用链相连时，则证明此对象时不可用的。



    上述不可达的对象，并非立即宣告死亡，至少需要经历两次标记过程：

对象进行根搜索后发现没有与GC Roots相连接的引用链，则会被第一次标记并且进行一次筛选，筛选条件是此对象是否有必要执行finalize()方法。如果对...]]></description><category></category></item><item><title><![CDATA[volatile关键字]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/111094154</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/111094154</guid><author>yj_android_develop</author><pubDate>Sun, 13 Dec 2020 17:32:42 +0800</pubDate><description><![CDATA[回顾之前Java内存模型特征可以了解到该模型是围绕着并发过程中如何处理原子性、可见性和有序性这三个特征来建立的。

    原子性：一个操作或多个操作要么全部执行完成且执行过程不被中断，要么就不执行。Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和write这六个，如果应用场景需要更大范围的原子性保证，Java内存模型还提供了lock和unlock操作来满足需求，比如synchronize关键字。在synchronize块之间的操作...]]></description><category></category></item><item><title><![CDATA[Java内存模型]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/110312227</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/110312227</guid><author>yj_android_develop</author><pubDate>Sun, 06 Dec 2020 12:19:24 +0800</pubDate><description><![CDATA[Android开发中，存在大量并发的情况，因此也会遇到很多线程安全问题，在查询线程安全相关资料时，通常会查到Java内存模型的知识点。Java内存模型的主要目标是定义程序中各个变量的访问规则，即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。为了获得较好的执行效能，Java内存模型并没有限制执行引擎使用处理器的特定寄存器或缓存来和主内存进行交互，也没有限制即时编译器调整代码执行顺序这类权利。

    Java内存模型规定了所有的变量都存储在主内存中。每条线程有自己的工作...]]></description><category></category></item><item><title><![CDATA[JVM内存区域划分]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/109702081</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/109702081</guid><author>yj_android_develop</author><pubDate>Sun, 29 Nov 2020 14:21:12 +0800</pubDate><description><![CDATA[Java虚拟机在执行Java程序过程中会把它所管理的内存划分为以下区域：



    程序计数器：一块较小的内存空间，它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机概念模型里，字节码解释器工作就是通过改变这个计数器的值来选取下一条需要执行的字节码指令，分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

    由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的，在任何一个确定的时刻，一个处理器（对于多核处...]]></description><category></category></item><item><title><![CDATA[面向对象设计原则——迪米特法则]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/109921914</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/109921914</guid><author>yj_android_develop</author><pubDate>Sun, 22 Nov 2020 10:21:52 +0800</pubDate><description><![CDATA[迪米特法则(Law of Demeter, LoD)：一个软件实体应当尽可能少地与其他实体发生相互作用。

    如果一个系统符合迪米特法则，那么当其中某一个模块发生修改时，就会尽量少地影响其他模块，扩展会相对容易，这是对软件实体之间通信的限制，迪米特法则要求限制软件实体之间通信的宽度和深度。迪米特法则可降低系统的耦合度，使类与类之间保持松散的耦合关系。

迪米特法则还有几种定义形式，包括：不要和“陌生人”说话、只与你的直接朋友通信等，在迪米特法则中，对于一个对象，其朋友包括以下几...]]></description><category></category></item><item><title><![CDATA[面向对象设计原则——单一职责原则]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/109921785</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/109921785</guid><author>yj_android_develop</author><pubDate>Sun, 22 Nov 2020 10:14:51 +0800</pubDate><description><![CDATA[单一职责原则是最简单的面向对象设计原则，它用于控制类的粒度大小。

    单一职责原则（Single Responsibility Principle,SRP）：一个类只负责一个功能领域中的相应职责，或者可以定义为：就一个类而言，应该只有一个引起它变化的原因。

    单一职责原则告诉我们：一个类不能太“累”！在软件系统中，一个类（大到模块，小到方法）承担的职责越多，它被复用的可能性就越小，而且一个类承担的职责过多，就相当于将这些职责耦合在一起，当其中一个职责变化时，可能...]]></description><category></category></item><item><title><![CDATA[面向对象设计原则——合成复用原则]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/109700503</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/109700503</guid><author>yj_android_develop</author><pubDate>Sun, 15 Nov 2020 09:58:07 +0800</pubDate><description><![CDATA[合成复用原则又称为组合/聚合复用原则(Composition/Aggregate Reuse Principle, C/ARP)，定义：尽量使用对象组合，而不是继承来达到复用的目的。

    合成复用原则就是在一个新的对象里通过关联关系（包括组合关系和聚合关系）来使用一些已有的对象，使之成为新对象的一部分；新对象通过委派调用已有对象的方法达到复用功能的目的。简言之：复用时要尽量使用组合/聚合关系（关联关系），少用继承。

    在面向对象设计中，可以通过两种方法在不同的环...]]></description><category></category></item><item><title><![CDATA[面向对象设计原则——接口隔离原则]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/109700447</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/109700447</guid><author>yj_android_develop</author><pubDate>Sun, 15 Nov 2020 09:52:27 +0800</pubDate><description><![CDATA[接口隔离原则(Interface Segregation Principle, ISP)：使用多个专门的接口，而不使用单一的总接口，即客户端不应该依赖那些它不需要的接口。

   根据接口隔离原则，当一个接口太大时，我们需要将它分割成一些更细小的接口，使用该接口的客户端仅需知道与之相关的方法即可。每一个接口应该承担一种相对独立的角色，不干不该干的事，该干的事都要干。这里的“接口”往往有两种不同的含义：一种是指一个类型所具有的方法特征的集合，仅仅是一种逻辑上的抽象；另外一种是指某种语言...]]></description><category></category></item><item><title><![CDATA[面向对象设计原则——里氏代换原则]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/109555527</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/109555527</guid><author>yj_android_develop</author><pubDate>Sun, 08 Nov 2020 08:51:15 +0800</pubDate><description><![CDATA[里氏代换原则(Liskov Substitution Principle, LSP)：所有引用基类（父类）的地方必须能透明地使用其子类的对象。

    里氏代换原则告诉我们，在软件中将一个基类对象替换成它的子类对象，程序将不会产生任何错误和异常，反过来则不成立，如果一个软件实体使用的是一个子类对象的话，那么它不一定能够使用基类对象。例如：我喜欢动物，那我一定喜欢狗，因为狗是动物的子类；但是我喜欢狗，不能据此断定我喜欢动物，因为我并不喜欢老鼠，虽然它也是动物。

   例如有...]]></description><category></category></item><item><title><![CDATA[XXX iPhone has denied the launch request]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/109413196</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/109413196</guid><author>yj_android_develop</author><pubDate>Sun, 01 Nov 2020 11:49:51 +0800</pubDate><description><![CDATA[在Xcode运行 应用的时候，出现 iPhone has denied the launch request.这个问题。

目前我遇到的原因是：Signing 需要重新配置一下，重新选一下Automatically manage signing。就OK了。
]]></description><category></category></item><item><title><![CDATA[面向对象设计原则——依赖倒置原则]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/109413114</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/109413114</guid><author>yj_android_develop</author><pubDate>Sun, 01 Nov 2020 11:47:11 +0800</pubDate><description><![CDATA[如果说开闭原则是面向对象设计的目标的话，那么依赖倒置原则就是面向对象设计的主要实现机制之一，它是系统抽象化的具体实现。

    依赖倒置原则定义： 抽象不应该依赖于细节，细节应当依赖于抽象。换言之，要针对接口编程，而不是针对实现编程。

   依赖倒置原则要求我们在程序代码中传递参数时或在关联关系中，尽量引用层次高的抽象层类，即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明，以及数据类型的转换等，而不要用具体类来做这些事情。为了确保该原则的应用，一个具体...]]></description><category></category></item><item><title><![CDATA[面向对象设计原则——开闭原则]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/109270176</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/109270176</guid><author>yj_android_develop</author><pubDate>Sun, 25 Oct 2020 10:12:44 +0800</pubDate><description><![CDATA[开闭原则是面向对象的可复用设计的第一块基石，它是最重要的面向对象设计原则。开闭原则由Bertrand Meyer于1988年提出。

   定义：开闭原则(Open-Closed Principle, OCP)：一个软件实体应当对扩展开放，对修改关闭。即软件实体应尽量在不修改原有代码的情况下进行扩展。
    在开闭原则的定义中，软件实体可以指一个软件模块、一个由多个类组成的局部结构或一个独立的类。
    任何软件都需要面临一个很重要的问题，即它们的需求会随时间的...]]></description><category></category></item><item><title><![CDATA[QTcrash 查询方法]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/109142827</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/109142827</guid><author>yj_android_develop</author><pubDate>Sun, 18 Oct 2020 11:19:31 +0800</pubDate><description><![CDATA[c++filt  _ZN26NGLatestHistroyList_PluginC1Ev（指定是具体crash的信息）
]]></description><category></category></item><item><title><![CDATA[不要轻忽编译器的警告——条款53]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/109010798</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/109010798</guid><author>yj_android_develop</author><pubDate>Sun, 11 Oct 2020 13:54:03 +0800</pubDate><description><![CDATA[许多程序员习惯性地忽略编译器警告。他们认为，毕竟，如果问题很严重，编译器应该给一个错误信息而非警告信息，不是吗？这种想法对其他语言或许相对无害，但在C++，我敢打赌编译器作者对于将会发生的事情比你有更好的领悟。例如：


class B {
public:
    virtual void f() const;
};
class D: public B {
public:
    virtual void f();
};

    这里希望以D::f重新定义virtual函数B::f...]]></description><category></category></item><item><title><![CDATA[写了placement new也要写placement delete——条款52]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/108907806</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/108907806</guid><author>yj_android_develop</author><pubDate>Sat, 03 Oct 2020 11:32:12 +0800</pubDate><description><![CDATA[placementnew和placementdelete并非C++兽栏中最常见的动物，如果你不熟悉它们，不要感到挫折或忧虑。回忆条款16和17，当你写一个new表达式像这样：


Widget* pw = new Widget;

共有两个函数被调用：一个是用以分配内存的operatornew，一个是Widget的default构造函数。

    假设其中第一个函数调用成功，第二个函数却抛出异常。既然这样，步骤一的内存分配所得必须取消并恢复旧观，否则会造成内存泄漏。在这个时候...]]></description><category></category></item><item><title><![CDATA[编写new和delete时需固守常规——条款51]]></title><link>https://blog.youkuaiyun.com/yj_android_develop/article/details/108875259</link><guid>https://blog.youkuaiyun.com/yj_android_develop/article/details/108875259</guid><author>yj_android_develop</author><pubDate>Tue, 29 Sep 2020 21:39:28 +0800</pubDate><description><![CDATA[条款50已解释什么时候你会想要写个自己的operatornew和operatordelete，但并没有解释当你那么做时必须遵守什么规则。这些规则不难奉行，但其中一些并不直观，所以知道它们究竟是些什么很重要。

    让我们从operatornew开始。实现一致性operatornew必须得返回正确的值，内存不足时必得调用new-handling函数（见条款 49），必须有对付零内存需求的准备，还需避免不慎掩盖正常形式的new——虽然比较偏近class的接口要求而非实现要求。...]]></description><category></category></item></channel></rss>