2018-07-11

作者: nucky_lee | 来源:发表于2018-07-11 15:36 被阅读0次

    18-07-11 随笔

    恍惚间,18年已过一半。心血来潮想记录点东西。

    过完年直到现在,公司移动端项目基本处于停滞状态,小程序倒是迎来一波开发高潮。先后做了**闪惠一卡通、**实体店、**科技美容等小程序项目。今日为止,**科技美容小程序又到了提测日,接下来可以松一口气,想想接下来该做的事情了。

    下午忽然想到OC中为什么要使用alloc/init而很少使用new,然后搜了一下相关的内容,下面分享一下。


    首先看源码:

    -------------------------------------------------------

    + (instancetype)new {

         id   newObject = (*_alloc)((Class)self, 0);

         Class   metaClass = self->isa;

         if (class_getVersion(metaClass)  >  1)

              return   [newObject   init];

          else

               return   newObject;

    }

    -------------------------------------------------------

    而 alloc/init 像这样:

    -------------------------------------------------------

    + (instancetype)alloc {

    return   (*_zoneAlloc)((Class)self,  0,  malloc_default_zone());

    }

    - (instancetype)init {

         return   self;

    }

    会发现new方法其实内部调用了init方法,很显然在调用之前还分配了内存

    也就是说[class_objc  alloc]  init] 实际上做了两步allocWithZone和init,这个allocWithZone是个什么东东呢?它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度; 而new只是进行alloc内存分配,然后init。

    为什么不推荐使用new?

    -------[class_objc  alloc]  init]可以自定义init方法,如果使用new的话,初始化方法被固定死只能调用init,而你想调用initXXX怎么办

    为什么要把alloc 和init 分开?

    -------为了方便根据需要去调用不同的初始化方法

    相关文章

      网友评论

        本文标题:2018-07-11

        本文链接:https://www.haomeiwen.com/subject/pzyhpftx.html