61阅读

ios每隔一段时间执行-腾讯:QQ与360不共存分段实行 无执行时间表

发布时间:2017-09-17 所属栏目:C++

一 : 腾讯:QQ与360不共存分段实行 无执行时间表

【搜狐IT消息】11月4日消息,腾讯公司在腾讯北京总部举行新闻发布会,就近期发生的腾讯和360大战进行解读。腾讯公司在现场接受搜狐IT专访时表示:腾讯QQ和360在用户桌面不共存将分段实行,但目前尚无实施的明确时间表。

对于即将实施的QQ和360在用户桌面不共存的措施,腾讯高管称,不希望将用户的桌面当成一个战场,做出这个决定并不是出于商业目的,如果是商业目的腾讯不会选择这种作法。

腾讯方面昨日突然发布“致广大QQ用户的一封信”,称决定将在装有360软件的电脑上停止运行QQ软件。这是360与腾讯大战爆发以来最激烈的回应和进展。

昨晚23:49分,腾讯方面公布了要求360方面卸载扣扣保镖三大和解条件。截至11月4日00:38分,360对外发出最新声明,称不向霸权妥协,并要求腾讯停止强制用户的非法行为。

今天上午,腾讯发布第二封公开信,对网友的质疑和指责进行了回应,称不眠之夜的斗争背后有诸多苦衷,对于360召回扣扣保镖的做法,腾讯高管称,希望360向包括金山、可牛在内的众多企业道歉。(小安)

二 : IOS - 运行时 (多态)

一 多态概述

         多态指同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。(www.61k.com]它是面向对象程序设计(OOP)的一个重要特征,动态类型能使程序直到执行时才确定对象的所属类,其具体引用的对象在运行时才能确定。动态绑定能使程序直到运行时才确定调用对象的实际方法。

         C++中的多态性具体体现在运行和编译两个方面,编译时多态是静态多态(重载、模版),在编译时就可以确定对象使用的形式,运行时多态是动态多态(虚函数,抽象类,覆盖)。

          C++使用虚函数(虚函数表)来实现动态绑定,当基类对象的指针(或引用)指向派生类的对象时候,实际调用的是派生类相应的函数。

         Objective-c 是动态语言,所以它具有动态类型和动态绑定的特性。Objective-c系统总是跟踪对象所属的类。对于类型的判断和方法的确定都是在运行时进行。 那Objective-c是怎么样实现多态特性的呢?

二 Objective-c多态

     首先看下面代码

     draw.h文件

     @interface Draw : NSObject
     @property (nonatomic,strong) NSString *name;
       - (void) Print;
       - (void) draw;
     @end

     

     draw.m文件

      #import "Draw.h"
     @implementation Draw
     @synthesize name;
     - (id) init
     {

         if (self = [super init])
         {
             self.name = @"Draw Demo";
         }     
         return self;
     }
     - (void) draw
     {
           NSLog(@"Draw::draw.......");
     }
     - (void) Print
     {
         NSLog(@"i am  %@.",self.name);
     }
     @end

     

      cricle.h文件

      #import "Draw.h"

     @interface Circle : Draw
     @end     

      circle.m文件

      #import "Circle.h"

     @implementation Circle
     - (void) draw
     {
         NSLog(@"%@:draw circle",self.name);
     }
     @end

     

     Retangle.h文件

     #import "Draw.h"

     @interface Retangle : Draw
     @end

     

     Retangle.m文件

     #import "Retangle.h"

     @implementation Retangle
     - (void) draw
     {
         [super draw]; //通过super关键字可以调用基类的draw函数
         NSLog(@"%@:draw retangle",self.name);
     }
     @end

       我们定义了一个Draw基类,里面有一个数据成员name,和两个函数成员draw和Print,Circle和Retangle是从Draw派生的两个类,他们重写了基类Draw的draw方法。

代码使用

        Draw* base = [[Circle alloc] init];

      [base draw]; //draw circle
      NSLog(@"address:%@",base);
       
      base = [[Retangle alloc] init];
      [base draw]; //draw retangle
      NSLog(@"address:%@",base);
      [base Print];

输出结果

     2014-04-09 15:34:41.648 duotaidemo[7718:303] Draw Demo:draw circle

     2014-04-09 15:34:41.673 duotaidemo[7718:303] address:<Circle: 0x1002027a0>
     2014-04-09 15:34:41.674 duotaidemo[7718:303] Draw::draw.......
     2014-04-09 15:34:41.674 duotaidemo[7718:303] Draw Demo:draw retangle
     2014-04-09 15:34:41.675 duotaidemo[7718:303] address:<Retangle: 0x100205e70>

扩展:运行时多态 / java运行时多态 / 运行时的多态


     2014-04-09 15:34:41.676 duotaidemo[7718:303] i am  Draw Demo.

      使用基类的指针分别指向创建的两个派生类对象,然后分别调用各自的draw函数,通过输出结果可以发现他们调用的是各自的draw方法。由于Retangele没有重写基类的Print函数,所有使用[base Print]调用的是基类的方法。同时通过address的输出发现base指向了两个不同的对象。

小结:

        1.与C++ 的多态相比,在Objective-c中是没有virtual关键字的,默认情况下只要子类重写了父类的方法就实现了覆盖(这一点和java类似),在Objective-c中同一类中的函数是不能被重载的。

        2.在Objective-c中,通过super关键字可以调用基类的函数,这个在C++中是没有的,在C++中可通过作用域运算符访问基类成员。

      

     除了上面的调用方式外,我们也可以这样:

         id base = [[Circle alloc] init];
        [base draw]; //draw circle
         NSLog(@"address:%@",base);
       
        base = [[Retangle alloc] init];
        [base draw]; //draw retangle
         NSLog(@"address:%@",base);

        [base Print];

   

       其输出结果和上面是一样的

        既然Objective-c中没有像C++一样的虚函数表,那它的多态是怎么实现的?它的类型系统是怎么样构建起来的呢?继续往下看吧!

三  类对象

       虽然Objective-c没有虚函数表,但是它有一个根类NSObject,下面让我们探究一下这个根类是个什么东东。

     objc.h 文件中关于NSObject的定义

     @interface NSObject <NSObject>

     {
         Class isa  OBJC_ISA_AVAILABILITY;

     }

     typedef struct objc_class *Class; 

     typedef struct objc_object {
         Class isa;

     } *id;

     typedef struct objc_selector  *SEL;

     typedef id (*IMP)(id, SEL, ...);

详见:http://opensource.apple.com/source/objc4/objc4-493.9/runtime/objc.h

 

通过上面的定义我们可以知道以下事实:

     1.Class isa 是NSObject类的第一个数据成员。

     2.Class 是一个指针,它指向一个objc_class的结构体。

     3.id 类型是一个指针,它指向一个objc_object的结构体,该结构体只有一个成员即Class isa;

     4.id 类型是一个指针,它指向一个存有objc_class的结构对象的指针的指针。

 3.1 isa介绍

以下是苹果官方文档对isa的介绍说明:    

       Every object is connected to the run-time system through its isa instance variable, inherited from the NSObject class. isa identifies the object's class; it points to a structure that's compiled from the class definition. Through isa, an object can find whatever information it needs at run timesuch as its place in the inheritance hierarchy, the size and structure of its instance variables, and the location of the method implementations it can perform in response to messages.

              

       实例变量是通过isa成员链接到运行时系统环境中的,任意NSObject的子类都会继承NSObject的isa成员,而且当NSObject的子类实例化对象时,isa实例变量永远是对象的第一个实例变量。isa指向该对象的类对象,它是实例和类对象连接的桥梁。

      

      

     实例变量和类对象的关联,如下图所示:

多态 IOS - 运行时 (多态)

下面是类对象(objc_class)的结构体

     struct objc_class {

Class isa;/* metaclass */ Class super_class /* 父类的地址 */constchar*name /* 类名称 */longversion /* 版本 */longinfo/* 类信息 */longinstance_size /* 实例大小 */structobjc_ivar_list *ivars /* 实例参数列表*/structobjc_method_list **methodLists/* 方法列表 */structobjc_cache *cache /* 方法缓存 */structobjc_protocol_list *protocols/* protocol链表*/

     } ;  

        在Objective-C中类也是一种对象,而且在程序运行时一直存在。 类对象是一个根据类定义生成的一个结构体,里面存储了类的基本信息, 如:类的大小,类的名称,类的版本以及消息与函数的映射表等信息。类对象所保存的信息在程序编译时确定,在程序启动 时加载到内存中。

 3.2 id介绍

扩展:运行时多态 / java运行时多态 / 运行时的多态

     

    由上面的定义我们知道,id类型是一个指向类对象的指针的指针。在Objective-c中,id类型是一种通用的指针类型,id类型可以用来指向属于任何类的对象(只要该对象是属于NSObject即成体系)。 

   

    id类型的使用如下图所示:

多态 IOS - 运行时 (多态)

   在使用id类型的时候要注意:

   

   1. id类型本事是一个指针类型,在使用时就不用加*号了,例如上面的例子 id base = [[Circle alloc] init];

   2.  id类型是通用指针类型,弱类型,编译时不进行类型检查

       Objective-C可以将对象分为id类型和静态类型,如果不涉及到多态,尽量使用静态类型。

      在上的例子中我们使用了两种方式来调用派生类函数,第一种使用的即使静态类型,第二种使用的是id动态类型。在写代码时候,尽量使用静态类型,静态类型可更好的在编译阶段而不是运行阶段指出错误,同时能够提高程序的可读性。

四 小结

        实例变量中isa成员用于保持其类对象在内存的地址,类对象对于所有实例来说在内存中只有一份副本,任何一个实例都可以通过 isa成员,访问类对象所保持的类的信息,isa成员可以通过类对象获得当前实例可以访问的消息列表,以及消息对应的函数地址。

         Objecive-c使用类对象的形式来实现运行多态,每个对象都保存其类对象的地址,类对象中保存了类的基本信息。类对象是进行动态创建(反射),动态识别,消息传递等机制的基础。

      那么上面的程序中,函数的调用过程时怎么样利用类对象的呢?

      下一节将会讲述Objective-c消息传递机制,以进一步解剖函数的调用过程。

扩展:运行时多态 / java运行时多态 / 运行时的多态

三 : 再等一段时间:iOS 9应用暂时不能“瘦身”了

iOS 9 中最受用户欢迎的特性之一或许就是“App Thinning,”它将能够帮助用户大大减少安装应用时所需要的设备空间。可惜好像目前升级到 iOS 9 的用户暂时还不能体验这个新的特性。苹果公司日前在苹果开发者中心发布公告表示,因为 iCloud 问题 App Thinning 的上线时间将会推迟。根据苹果的介绍,这个问题是与 iOS 9 应用在iCloud中生成的备份有关。

因为 iCloud 问题 App Thinning 的上线时间将会推迟,但也只是暂时的。

苹果公告表示,因为 iOS 9 iCloud 备份出现了问题,App Store 中的部分应用只能恢复到 iOS 设备的同一个机型上,所以应用瘦身功能目前还不能使用。

当客户下载您的 iOS 9 应用,他们只能够获得您的应用的通用版本,而不是针对不同设备类型优化过的不同版本。TestFlight 将能够继续给您的内部测试者提供不同的变体版本。未来软件更新之后,应用瘦身功能将可重新投入使用。目前您还不需要采取任何应对措施。

苹果这则声明也解释了此前几周发布的应用更新自昨天早上起又重新发布了一遍,或许原因都与上述问题相关。TestFlight 虽然可以继续使用 App Thinning,但是开发者还不能在App Store上提供应用的“瘦身版。”

App Thinning 将能够提升应用在设备上的安装和启动速度,占用的空间也会比原来更小。其实 App Thinning 功能中有三个独立的机制,分别是App Slicing、on-demand resources 以及 Bitcode,它们在节省 iOS 应用资源方面发挥着各自的作用。

其中 App Slicing 在节省应用所需资源中发挥着最重要的作用。很多应用需要在不同尺寸的设备上运行,针对这些不同的设备,它们内含不同的独立资源,而大部分是你的设备不需要的。有了 App Slicing,开发者就可以根据设备添加资源标签,当用户从 iTunes 下载应用时,它将仅仅下载当前设备需要的资源。

ODR(on-demand resources 随需应变资源)是 iOS 减少应用资源消耗的另外一种方法。当用户点击应用内容的时候,就会动态从App Store上进行下载,也就是说用户只会在需要的时候占用存储空间。这项功能有趣之处还在于当将这些内容在后台进行下载之后,当存储空间紧张的时候会自动进行删除。

Bitcode 则是在用户下载应用之前,App Store 在自动编译应用程序。这样,即使开发者没有给他们的代码添加标签,应用也能够执行App Slicing的部分功能,仅下载设备需要的 32 或 64 位代码。不过 Bitcode 也意味着如果苹果完善编译器提高代码效率,用户下载应用时苹果进行的完善会自动整合进去。

iOS 9 的更新包体积从原来的 4.6GB 降至现在的 1.3GB,让不少 8GB、16GB 的 iPhone 和 iPad 老用户非常开心。而 App Thinning 方案进一步减小了系统在运行应用等多种实用情景时的存储资源占用,令人期待。

[via Soft Pedia]

访问:

苹果在线商店(中国)

本文标题:ios每隔一段时间执行-腾讯:QQ与360不共存分段实行 无执行时间表
本文地址: http://www.61k.com/1104135.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1