CN107301095A - ***运行方法以及操作*** - Google Patents
***运行方法以及操作*** Download PDFInfo
- Publication number
- CN107301095A CN107301095A CN201710449947.4A CN201710449947A CN107301095A CN 107301095 A CN107301095 A CN 107301095A CN 201710449947 A CN201710449947 A CN 201710449947A CN 107301095 A CN107301095 A CN 107301095A
- Authority
- CN
- China
- Prior art keywords
- corpse
- agent
- observer
- present
- methods described
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5022—Mechanisms to release resources
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/50—Indexing scheme relating to G06F9/50
- G06F2209/5011—Pool
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明实施例提供一种***运行方法及操作***,涉及软件开发领域。其中,所述***运行方法包括:通过钩子操作阻止对象的释放;根据配置信息判断所述对象是否可以转为僵尸对象;在判断为是的情况下,将所述对象转为所述僵尸对象并将所述僵尸对象添加至僵尸对象池。本发明实施例提供的技术方案能够改善例如IOS***的稳定性。
Description
技术领域
本发明实施例涉及软件开发领域,尤其涉及一种***运行方法以及操作***。
背景技术
随着互联网技术以及通信技术的快速发展,操作***已经从个人电脑领域迅速普及到移动终端领域。在操作***方面,以微软操作***、安卓操作***和IOS(由苹果公司开发的一款操作***)操作***为主流,诸多其它操作***为支流,迅速覆盖了软件市场。但是,操作***自身存在或多或少的问题。以广受消费者喜爱的IOS***为例,其自身也存在一些缺陷,会严重影响用户体验。例如,现有版本的IOS***程序常因内部或外部因素导致软件运行发生崩溃(crash)。
现有技术已经尝试发现操作***发生崩溃的原因,但是,却没有很好的方法予以改善。
发明内容
本发明实施例提供一种***运行方法及操作***,用以解决现有操作***不稳定的问题。
第一方面,本发明实施例中提供了一种***运行方法,包括:
通过钩子操作阻止对象的释放;
根据配置信息判断所述对象是否可以转为僵尸对象;
在判断为是的情况下,将所述对象转为所述僵尸对象并将所述僵尸对象添加至僵尸对象池。
结合第一方面,在本发明第一方面的第一种实现方式中,所述将所述对象转为所述僵尸对象,包括:
释放所述对象的关联对象及属性;
将所述对象的isa指针修改为指向僵尸类对象。
结合第一方面或第一方面的第一种实现方式,在本发明第一方面的第二种实现方式中,还包括:
记录所述对象转为所述僵尸对象之前的类名;
将所述对象的类名与所述僵尸对象绑定。
结合第一方面,在本发明第一方面的第三种实现方式中,所述方法还包括:
在消息转发的第二阶段创建临时对象,所述临时对象具有返回类型为id的空实现,用于接收无法响应的方法。
结合第一方面,在本发明第一方面的第四种实现方式中,所述方法还包括:
响应于容器类中***的空对象(nil对象)而返回空和下标越界;或
在确定下标越界的情况下采用越界下标读取获取容器类中的对象。
结合第一方面,在本发明第一方面的第五种实现方式中,所述方法还包括:
为键值观察模式中的被观察对象创建键值观察代理对象,所述键值观察代理对象用于:
响应于接收到的通知查看映射关系表以确定是否存在观察者(observer);
在存在观察者时通知该观察者。
结合第一方面的第五种实现方式,在本发明第一方面的第六种实现方式中,所述方法还包括:在所述被观察对象被释放后,移除所述被观察对象在所述映射关系表中的映射关系。例如,采用NShashMap容器实现对所述映射关系表的管理。
结合第一方面,在本发明第一方面的第七种实现方式中,所述方法还包括:
创建代理对象,并建立计时器强引用代理对象、代理对象强/弱引用计时器、且代理对象弱引用目标对象(target)的引用关系。
结合第一方面的第七种实现方式,在本发明第一方面的第八种实现方式中,采用所述代理对象将回调的计时器事件转发给所述目标对象。
第二方面,本发明实施例提供了一种操作***,所述操作***采用上述第一方面或其各种实现方式的运行方法运行。
第三方面,本发明实施例提供一种安装有上述第二方面的操作***的设备终端。
第四方面,本发明实施例提供一种计算机存储介质,所述计算机存储介质存储有一条或多条计算机指令,所述一条或多条计算机指令被执行时实现以下处理:
通过钩子操作阻止对象的释放;
根据配置信息判断所述对象是否可以转为僵尸对象;
在判断为是的情况下,将所述对象转为所述僵尸对象并将所述僵尸对象添加至僵尸对象池。
结合第四方面,在本发明第四方面的第一种实现方式中,所述指令被执行时实现以下处理从而将所述对象转为所述僵尸对象:
释放所述对象的关联对象及属性;
将所述对象的isa指针修改为指向僵尸类对象。
结合第四方面或第四方面的第一种实现方式,在本发明第四方面的第二种实现方式中,所述指令被执行以实现以下处理:
记录所述对象转为所述僵尸对象之前的类名;
将所述对象的类名与所述僵尸对象绑定。
结合第四方面,在本发明第四方面的第四种实现方式中,所述指令被执行以实现以下处理:
在消息转发的第二阶段创建临时对象,所述临时对象具有返回类型为id的空实现,用于接收无法响应的方法。
结合第四方面,在本发明第四方面的第四种实现方式中,所述指令被执行以实现以下处理:
响应于容器类中***的空对象而返回空;或
在确定下标越界的情况下采用越界下标读取获取容器类中的对象。
结合第四方面,在本发明第四方面的第五种实现方式中,所述指令被执行以实现以下处理:
为键值观察模式中的被观察对象创建键值观察代理对象,所述键值观察代理对象用于:
响应于接收到的通知查看映射关系表以确定是否存在观察者;
在存在观察者时通知该观察者。
结合第四方面的第五种实现方式中,在本发明第四方面的第六种实现方式中,所述指令被执行以实现以下处理:在所述被观察对象被释放后,移除所述被观察对象在所述映射关系表中的映射关系。例如,采用NShashMap容器实现对所述映射关系表的管理。
结合第四方面,在本发明第四方面的第七种实现方式中,所述指令被执行以实现以下处理:
创建代理对象,并建立计时器强引用代理对象、代理对象强/弱引用计时器、且代理对象弱引用目标对象的引用关系。
结合第四方面,在本发明第四方面的第八种实现方式中,所述指令被执行以实现以下处理:
创建用于将回调的计时器事件转发给所述目标对象的所述代理对象。
本发明各种实施例能够改善操作***的稳定性,减少程序崩溃现象的发生。
本发明的这些方面或其他方面在以下实施例的描述中会更加简明易懂。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了根据本发明一个实施例的***运行方法的流程示意图;
图2示出了根据本发明另一个实施例的***运行方法的流程示意图;
图3示出了根据本发明又一个实施例的***运行方法的流程示意图;
图4示出了根据本发明一个实施例的键值观察模式的示意图;
图5示出了根据本发明一个实施例的改造后的kvo(Key-Value Observing,键值观察)的流程图;
图6示出了根据本发明实施例的一种与代理对象相关的引用关系图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。
在本发明的说明书和权利要求书及上述附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如101、102等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
首先,对本发明涉及或可能涉及的术语/名称进行解释。这些解释意在以简单的语言使本发明容易被理解,而并不用于限制本发明的保护范围。
崩溃(Crash):程序因内部或外部因素导致运行发生崩溃,例如,崩溃的一种表现为闪屏。
Runtime:程序运行时,OC(Objective-C语言)中的Runtime主要指运行时动态修改对象、方法的能力。
KVO:是苹果设计的一种观察者模式,该观察者别于一般的方式,主要体现在利用Runtime技术动态改变对象、修改对象的属性设置和获取方法。
Timer:计时器/定时器,基于底层时钟硬件的软件抽象层,用于计算时间,可以方便设置回调时间和回调次数。
addTarget:主要涉及苹果设计中的target-action设计模式中的目标对象(target),所述target-action设计模式主要使用依赖注入使消息响应和消息派发松耦合。
BadAccess:苹果的野指针异常错误类型,指的是访问了一块已经被释放的内存地址。
Proxy:指的是代理对象,本发明利用代理对象将对象本身的任务转移给proxy做。
Method swizzling:一种基于Runtime的技术,中文名为方法调配,自己定义一个方法实现可以与任何方法实现进行互换。
Hook:钩子,指对某个方法进行下钩,被钩中的方法调用时会给下钩的地方一个通知,OC中常用Method swizzling进行hook操作。
Associated object:关联对象,主要用于对象间。
Tracker:跟踪者,OC中常用关联对象实现,跟踪者和被关联者具有相同的生命周期,可以用于监听对象释放。
isa指针:苹果对OC的设计,每个对象都有一个isa指针指向它的类对象,类对象的isa则指向元类。这样设计便于进行方法查找调用。
retainCount:OC采用引用计数方式进行内存管理,retain方法就是使对象引用计数+1,release就是-1。当对象的引用计数为1时再次调用release对象内存就会被释放。retainCount用于查看对象目前的引用计数。
observer:对应kvo,是对象的观察者。
zombie:IOS采用的僵尸对象技术。
Runloop:苹果的每个线程都有一个runloop,一个runloop可以理解为一个死循环while(1){},这也是为什么一个app程序启动后不会直接退出的原因。定时器会定时的在该循环上进行回调。
消息调用:类似方法调用,只是结合IOS特性具备更强大的功能。
容器类:程序语言对数据结构进行封装用来存放其它对象的类。
图1是根据本发明实施例的一种***运行方法的流程示意图。示例性地,所述***运行方法基于IOS***而实现。参照图1,所述方法包括:
100:通过钩子操作阻止对象的释放。例如,采用hook操作钩住dealloc(释放内存)方法。
102:根据配置信息判断所述对象是否可以转为僵尸对象,如果判断为是,则执行104。
可选地,在本实施例的一种实现方式中,在配置信息中配置针对前缀和类名做定制化,从而根据配置信息判断当前对象是否是配置信息中配置的对象。换言之,可以在配置信息中针对可转化为僵尸对象的对象以及判断条件进行自定义。
可选地,在本实施例的一种实现方式中,如果确定对象不可以转为僵尸对象,则释放对象。
104:将所述对象转为所述僵尸对象并将所述僵尸对象添加至僵尸对象池。
采用本实施例提供的方法,通过阻止对象释放内存并将其修改为僵尸对象,使得当前对象的外部引用还会指向该对象并且在发送消息时还能接收到消息,能够解决因对野指针发送消息而导致程序崩溃的问题。
可选地,在本实施例的一种实现方式中,在处理104中,采用以下方式将对象转为僵尸对象:释放对象的关联对象及属性;将对象的isa指针修改为指向僵尸类对象。
可选地,在本实施例的一种实现方式中,还进行以下处理:记录所述对象转为所述僵尸对象之前的类名(className);将所述对象的类名与所述僵尸对象绑定。采用该实现方式,有利于在收到消息后产生日志(log),进而便于在发生问题时定位问题。
图2是根据本发明实施例的一种***运行方法的流程示意图。示例性地,所述***运行方法基于IOS***而实现。参照图2,所述方法包括:
200:钩住dealloc方法。
202:判断对象是否可以转为僵尸对象。例如,根据配置信息确定对象是否为配置信息中配置的对象,如果是,则可以转为僵尸对象。
204:在对象不可以转为僵尸对象的情况下,释放内存。
206:在对象可以转为僵尸对象的情况下,记录当前对象的类名,并继续后续处理。
208:释放当前对象的所有关联对象和属性。例如,调用objc_destructInstance方法实现处理208。
举例而言,在本实施例的一种实现方式中,采用处理208可以释放加载了100MB(兆字节)的对象的所有内容,然后进行后续处理。
210:修改isa指针为指向僵尸类对象。此外,还通过关联对象将对象僵尸化之前的类名绑定到所述僵尸对象。
在本实施例中,由于修改isa的方式不会改变对象的成员变量,所以,可以避免因使用不存在的属性导致超出对象申请的内存范围进而引发崩溃的问题。
212:将僵尸对象添加到僵尸对象池。此时,僵尸对象的retainCount为1,仅僵尸对象池持有该僵尸对象。
采用本实施例提供的方法,以应用于IOS操作***为例,能够解决IOS操作***因对野指针发送消息而导致程序崩溃的问题。
图3是根据本发明实施例的一种***运行方法的流程示意图。示例性地,所述***运行方法基于IOS***而实现。参照图3,所述方法包括以下处理过程:
在对象释放时,钩住dealloc方法。判断当前对象是否可以转为僵尸对象。在当前对象不可以转为所述僵尸对象的情况下,释放该当前对象。在当前对象可以转为僵尸对象的情况下,记录当前对象的类名;修改当前对象的isa指针为指向僵尸类对象;将得到的所述僵尸对象添加到僵尸对象池;释放外部引用使僵尸对象池成为所述僵尸对象的唯一引用;判断是否达到僵尸对象池阈值,并在达到阈值时淘汰老对象(例如,采用近期最少使用算法LRU(Least Recently Used)淘汰老对象);对于响应消息,创建与僵尸对象关联的临时对象响应消息并记录日志。
在根据本发明实施例的一种***运行方法中,以IOS***为例,在消息转发的第二阶段创建临时对象,所述临时对象具有返回类型为id的空实现,用于接收无法响应的方法。
IOS***的消息转发机制包含数个阶段。在本实现方式中,基于第二阶段进行hook操作,钩住NSObject中的forwardingTargetForSelector方法。之所以不对第一阶段的resolveInstanceMethod进行处理,是因为这样可以不改变原有类的方法列表而动态添加方法。当触发消息转发时,创建一个临时对象,该对象有一个id返回类型的空实现,任何无法响应的方法全部都转发给该对象的该方法即可。示例性地,空对象的定义如下:
在现有的消息调用过程中,当普通对象收到无法识别的消息时,IOS***会直接令程序崩溃。而采用本实现方式,则能够解决由于对象未实现方法却收到消息而导致的崩溃问题。
在根据本发明实施例的一种***运行方法中,以应用于IOS***为例,响应于容器类中***的nil对象而返回空,或,在获取容器类中的对象时判断是否下标越界,如果下标越界则采用越界下标获取容器类中的对象。
在本实施例的一种实现方式中,更具体而言,可以利用runtime methodswizzling采用其实现的方法替换***的实现,避免直接调用***API(ApplicationProgramming Interface,应用程序接口)引起崩溃。其中,与数组相关的处理相对较复杂,因为objectAtIndex在所有数组类型中都会存在,所以,在具体实现中,需要对所有的Array类型进行hook操作,然后,通过替换操作,将相关方法修改为当***对象存在nil时直接返回空,从而避免崩溃现象。
其中,示例性地,所hook的私有子类如下表所示:
其中,示例性地,进行替换操作的相关方法如下:
在本发明实施例的一种***运行方法中,以应用于IOS***为例,在kvo模式中,为键值观察模式中的被观察对象创建键值观察代理对象(也称作kvo代理对象),所述kvo代理对象用于:响应于接收到的通知查看映射关系表以确定是否存在观察者,并且在存在观察者时通知该观察者。
其中,所述kvo代理对象作为被观察对象的唯一观察者,会根据是否添加观察者属性来扩充自己观察的属性,该唯一观察者保存了其观察的key(键)与观察对象数组的映射表。
更具体地,在本实施例的一种具体实现方式中,如图4所示,为对象创建持有映射关系表的kvo代理对象,同时,该kvo代理对象是object的唯一观察者,其它观察者实际上都被kvo代理对象持有一份引用。当kvo代理对象收到通知时,会查看映射关系表以确定是否存在观察者。如果存在观察者,就通知该观察者。由于映射结构需要保存弱引用,所以,本实现方式选择Foundation提供的NSHashMap容器,其不仅可以存放弱引用,还可以在弱引用对象被释放后自动从将其从容器中移除。
采用上述实现方式,可以避免对已经释放的对象发送消息造成空指针异常。
现有IOS***在实现kvo时,并没有对异常进行很好的优化处理,而是采用非常暴力的方式直接让其crash。而采用本实施例,则能够有效解决kvo在observer释放、被观察者释放或多次移除(remove)观察者导致的崩溃问题。
图5是根据本发明实施例的一种改造后的kvo的流程图,参照图5,流程大致包括以下处理过程:
首先,添加kvo。
之后,判断被观察者是否绑定tracker。如果没有绑定tracker,则生成tracker关联对象并为tracker创建映射结构,然后继续第一后续处理。如果已经绑定tracker,则直接进行第一后续处理。在所述第一后续处理中,判断tracker是否已观察相应keypath(键路径,苹果的键值编码机制,每一个对象的属性都有唯一一个路径表示),如果没有观察所述keypath,则tracker添加对所述keypath的观察并继续第二后续处理;如果已经观察所述keypath,则在映射表中添加观察对象,并进行第二后续处理。
在第二后续处理中,在收到被观察者通知后,判断tracker映射表中相应key(观察者们观察的属性)下观察者是否已被全部释放,并在判断为是的情况下移除对该key的观察,在判断为否的情况下,通知所有观察该key的对象。
在第二后续处理中,在生命周期变化中,存在以下情况:
被观察者释放(即,释放了被观察者),此时,移除tracker并清空所有观察者;
观察对象移除(即,溢出了观察对象),此时,如果tracker存在相应keypath下的观察者,则移除该key下的该观察者。
采用本实施例,能够解决kvo在observer释放、被观察者释放或多次移除观察者导致的崩溃问题。
在根据本发明实施例的一种为键值观察模式中的被观察对象创建键值观察代理对象中,通过创建代理对象,并建立计时器强引用代理对象、代理对象强/弱引用计时器、且代理对象弱引用目标对象(target)的引用关系,从而解决现有计时器强引用目标对象导致在误操作下引起目标对象无法正常释放进而引起崩溃的问题。
具体而言,参照图6所示的引用关系图。其中,通过引入代理对象,使得在addTarget时,真正被添加的是代理对象。此时对象的引用关系为:runloop强引用计时器、计时器强引用代理对象、代理对象强/弱引用计时器(这里无所谓是强引用还是弱引用,因为即使是强引用,如下文所述,后续会解除循环)、代理对象弱引用目标对象。
当有计时器事件回调给代理对象时,由代理对象转发给目标对象。需要注意的一点是,转发前需要判断代理对象是否已经为nil,如果为nil,就将计时器invalid(失效)并置为nil(这样,也就解除了代理对象对计时器强引用的问题,也就是前文所述的无所谓强引用还是弱引用),此时,计时器就会释放内存,代理对象也就跟着释放内存了。
现有的IOS***中,计时器强引用目标对象,这样,在操作有误的情况下容易导致目标对象无法正常释放进而引起崩溃。而采用该实施例,通过创建所述代理对象,能够避免在操作有误的情况下由于目标对象无法正常释放而引起的崩溃问题。
以上对根据本发明的***运行方法的实施例及其实现方式进行了详细说明。本发明还提供一种操作***,该操作***采用如前文所述的运行方法。例如,该操作***基于IOS***并采用如前文所述的运行方法。此外,本发明还提供一种安装该操作***的设备终端。
本发明所提供的***运行方法,可以由本发明提供的计算机指令实现。具体而言,本发明实施例还提供一种计算机存储介质,用于存储所述计算机指令。所述计算机指令被执行时实现前述***运行方法。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件或借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
本发明公开A1、一种***运行方法,包括:
通过钩子操作阻止对象的释放;
根据配置信息判断所述对象是否可以转为僵尸对象;
在判断为是的情况下,将所述对象转为所述僵尸对象并将所述僵尸对象添加至僵尸对象池。
A2、如A1所述的方法中,所述将所述对象转为所述僵尸对象,包括:
释放所述对象的关联对象及属性;
将所述对象的isa指针修改为指向僵尸类对象。
A3、如A1或A2所述的方法中,所述方法还包括:
记录所述对象转为所述僵尸对象之前的类名;
将所述对象的类名与所述僵尸对象绑定。
A4、如A1所述的方法中,所述方法还包括:
在消息转发的第二阶段创建临时对象,所述临时对象具有返回类型为id的空实现,用于接收无法响应的方法。
A5、如A1所述的方法中,所述方法还包括:
响应于容器类中***的空对象而返回空;或
在确定下标越界的情况下采用越界下标读取获取容器类中的对象。
A6、如A1所述的方法中,所述方法还包括:
为键值观察模式中的被观察对象创建键值观察代理对象,所述键值观察代理对象用于:
响应于接收到的通知查看映射关系表以确定是否存在观察者;
在存在观察者时通知该观察者。
A7、如A6所述的方法中,在所述被观察对象被释放后,移除所述被观察对象在所述映射关系表中的映射关系。
A8、如A1所述的方法中,还包括:
创建代理对象,并建立计时器强引用所述代理对象、所述代理对象强/弱引用计时器、且所述代理对象弱引用目标对象的引用关系。
A9、如A8所述的方法中,还包括:
采用所述代理对象将回调的计时器事件转发给所述目标对象。
本发明还公开B10、一种采用如A1-A9中任一项所述的***运行方法的操作***。
本发明还公开C11、一种终端设备,所述终端设备安装有如B10所述的操作***。
本发明还公开D12、一种计算机存储介质,所述计算机存储介质存储有一条或多条计算机指令,所述指令被执行时实现如前述A1-A9中任一项所述的方法。
Claims (10)
1.一种***运行方法,其特征在于,包括:
通过钩子操作阻止对象的释放;
根据配置信息判断所述对象是否可以转为僵尸对象;
在判断为是的情况下,将所述对象转为所述僵尸对象并将所述僵尸对象添加至僵尸对象池。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
记录所述对象转为所述僵尸对象之前的类名;
将所述对象的类名与所述僵尸对象绑定。
3.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在消息转发的第二阶段创建临时对象,所述临时对象具有返回类型为id的空实现,用于接收无法响应的方法。
4.根据权利要求1所述的方法,其特征在于,所述方法还包括:
响应于容器类中***的空对象而返回空;或
在确定下标越界的情况下采用越界下标读取获取容器类中的对象。
5.如权利要求1所述的方法,其特征在于,所述方法还包括:
为键值观察模式中的被观察对象创建键值观察代理对象,所述键值观察代理对象用于:
响应于接收到的通知查看映射关系表以确定是否存在观察者;
在存在观察者时通知该观察者。
6.如权利要求5所述的方法,其特征在于,所述方法还包括:
在所述被观察对象被释放后,移除所述被观察对象在所述映射关系表中的映射关系。
7.如权利要求1所述的方法,其特征在于,所述方法还包括:
创建代理对象,并建立计时器强引用所述代理对象、所述代理对象强/弱引用计时器、且所述代理对象弱引用目标对象的引用关系。
8.如权利要求7所述的方法,其特征在于,
采用所述代理对象将回调的计时器事件转发给所述目标对象。
9.一种采用如权利要求1-8中任一项所述的***运行方法的操作***。
10.一种安装如权利要求9所述的操作***的终端设备。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710449947.4A CN107301095A (zh) | 2017-06-14 | 2017-06-14 | ***运行方法以及操作*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710449947.4A CN107301095A (zh) | 2017-06-14 | 2017-06-14 | ***运行方法以及操作*** |
Publications (1)
Publication Number | Publication Date |
---|---|
CN107301095A true CN107301095A (zh) | 2017-10-27 |
Family
ID=60135765
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710449947.4A Pending CN107301095A (zh) | 2017-06-14 | 2017-06-14 | ***运行方法以及操作*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107301095A (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108052407A (zh) * | 2017-12-13 | 2018-05-18 | 深圳乐信软件技术有限公司 | 一种应用程序崩溃防护方法、装置、设备及存储介质 |
CN108469993A (zh) * | 2018-04-04 | 2018-08-31 | 武汉斗鱼网络科技有限公司 | 消息转发方法、计算机可读存储介质及电子设备 |
CN109992482A (zh) * | 2019-04-11 | 2019-07-09 | 广州华多网络科技有限公司 | 观察中间件析构方法、装置、计算机设备和存储介质 |
CN111522645A (zh) * | 2020-04-29 | 2020-08-11 | 北京字节跳动网络技术有限公司 | 对象的处理方法、装置、电子设备及计算机可读存储介质 |
CN111694676A (zh) * | 2020-04-30 | 2020-09-22 | 北京奇艺世纪科技有限公司 | 一种针对键值观察模式的处理方法及装置 |
CN112052054A (zh) * | 2020-09-02 | 2020-12-08 | 北京奇艺世纪科技有限公司 | 函数调用方法、装置、电子设备及存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150370553A1 (en) * | 2014-06-24 | 2015-12-24 | International Business Machines Corporation | Wrapping computer software applications |
CN106557300A (zh) * | 2015-09-24 | 2017-04-05 | 腾讯科技(深圳)有限公司 | 一种野指针的函数栈信息确定方法、装置及电子设备 |
-
2017
- 2017-06-14 CN CN201710449947.4A patent/CN107301095A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150370553A1 (en) * | 2014-06-24 | 2015-12-24 | International Business Machines Corporation | Wrapping computer software applications |
CN106557300A (zh) * | 2015-09-24 | 2017-04-05 | 腾讯科技(深圳)有限公司 | 一种野指针的函数栈信息确定方法、装置及电子设备 |
Non-Patent Citations (1)
Title |
---|
JINGXIANLI0922: "好想法---抓取 crash,我们要在crash产生的时候直接自动修复它!", 《HTTPS://BLOG.CSDN.NET/JASONJWL/ARTICLE/DETAILS/54016750》 * |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108052407A (zh) * | 2017-12-13 | 2018-05-18 | 深圳乐信软件技术有限公司 | 一种应用程序崩溃防护方法、装置、设备及存储介质 |
CN108469993A (zh) * | 2018-04-04 | 2018-08-31 | 武汉斗鱼网络科技有限公司 | 消息转发方法、计算机可读存储介质及电子设备 |
CN109992482A (zh) * | 2019-04-11 | 2019-07-09 | 广州华多网络科技有限公司 | 观察中间件析构方法、装置、计算机设备和存储介质 |
CN109992482B (zh) * | 2019-04-11 | 2023-10-31 | 广州方硅信息技术有限公司 | 观察中间件析构方法、装置、计算机设备和存储介质 |
CN111522645A (zh) * | 2020-04-29 | 2020-08-11 | 北京字节跳动网络技术有限公司 | 对象的处理方法、装置、电子设备及计算机可读存储介质 |
CN111522645B (zh) * | 2020-04-29 | 2023-09-12 | 抖音视界有限公司 | 对象的处理方法、装置、电子设备及计算机可读存储介质 |
CN111694676A (zh) * | 2020-04-30 | 2020-09-22 | 北京奇艺世纪科技有限公司 | 一种针对键值观察模式的处理方法及装置 |
CN111694676B (zh) * | 2020-04-30 | 2024-03-05 | 北京奇艺世纪科技有限公司 | 一种针对键值观察模式的处理方法及装置 |
CN112052054A (zh) * | 2020-09-02 | 2020-12-08 | 北京奇艺世纪科技有限公司 | 函数调用方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107301095A (zh) | ***运行方法以及操作*** | |
CN107562513B (zh) | 一种基于java的智能合约生命周期的管理方法 | |
Miller et al. | Concurrency among strangers: Programming in E as plan coordination | |
CN110392052A (zh) | 一种区块链智能合约处理***及方法 | |
CN107105061A (zh) | 一种服务注册方法及装置 | |
CN109213462B (zh) | Android横竖屏数据同步方法、装置、终端及可读介质 | |
CN109343937A (zh) | 一种跨设备部署的分布式计算*** | |
CN110244990A (zh) | 应用组件调用方法、装置、电子设备及存储介质 | |
CN106296135A (zh) | 事件提醒方法、装置及终端 | |
CN109933356A (zh) | 远程代理类热替换方法及装置 | |
CN104408073B (zh) | 数据操作方法和装置 | |
CN108446149A (zh) | 一种第三方动态库接口拦截方法及*** | |
WO2020211570A1 (zh) | 缓存处理方法、装置、设备及计算机可读存储介质 | |
CN113722754B (zh) | 隐私可执行文件的生成方法、装置和服务器 | |
van Glabbeek et al. | On characterising distributability | |
CN109977093A (zh) | 基于lxc的多虚拟***查看容器日志的方法及装置 | |
CN109343983A (zh) | 功能模块间的信息交互方法、装置、设备及存储介质 | |
CN106897610A (zh) | 一种定位保护的方法和装置 | |
CN111126977A (zh) | 一种区块链***的交易处理方法 | |
CN108875381A (zh) | 一种支持内核模块隔离的消息服务模块的设计方案 | |
Osiński et al. | A novel programmable software datapath for software-defined networking | |
CN106293679B (zh) | 一种元素名称冲突处理方法及装置 | |
CN107145390A (zh) | 安卓服务生命周期管理方法、服务管理对象及安卓*** | |
Utas | Robust Communications Software: Extreme Availability, Reliability and Scalability for Carrier-Grade Systems | |
Clark et al. | Multi-threading and message communication in Qu-Prolog |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20171027 |
|
RJ01 | Rejection of invention patent application after publication |