美文网首页
iOS_Objective-C探究alloc方法的实现

iOS_Objective-C探究alloc方法的实现

作者: Mark_Ming | 来源:发表于2016-03-16 23:52 被阅读601次

        OS X,iOS中的大部分作为开源软件公开在 Apple Open Source 上。虽然想让大家参考NSObject类的源代码,但是很遗憾,包含NSObject类的Foundation框架没有公开。不过Foundation框架使用的是Core Foundation框架的源代码,以及通过调用NSObject类进行内存管理部分的源代码是公开的。但是,没有NSObject类的源代码,就很难了解NSObject类的内部实现细节。为此,我们可以通过开源软件GNU step来说明。

        GNU step是Cocoa框架的互换框架。也就是说,GNU step的源代码虽不能说于苹果的Cocoa完全相同,但是从使用者角度来看,两者的行为和实现方式是一样的,或者说非常相似。理解了GNU step源代码也就相当于理解了苹果的Cocoa实现。

        我们先来看看GNU step源代码中NSObject类的alloc类方法。为了明确重点,有的地方对引用的源代码进行了摘录或者在不改变原意的范围进行了修改。

id obj = [NSObject alloc];

       上述调用的alloc类方法在NSObject.m源代码中的实现如下:

+ (id)alloc

{

             return [self allocWithZone:NSDefaultMallocZone()];

}

+ (id)allocWithZone:(struct _NSZone *)zone

{

             return NSAllocateObject(self, 0, z);

}

        通过allocWithZone:类方法调用NSAllocateObject函数分配了对象。下面我们来看看NSAllocateObject函数的实现:

struct obj_layout{

        NSUInteger retained;

};

inline id

NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone *zone)

{

      int size = 计算容纳对象所需内存大小;

      id new = NSZoneMalloc(zone, size);

      memset(new, 0, size);

      new = (id) & ((struct obj_layout *) new)[1];

}

              NSAllocateObject函数通过调用NSZoneMalloc函数来分配存放对象所需的内存空间,之后将该内存空间置为0,最后返回作为对象而使用的指针。

              以下是去掉NSZone后简化了的源代码:

struct obj_layout{

           NSUInteger retained;

};

+ (id)alloc

{

           int size = sizeof(struct obj_layout) + 对象大小;

           struct obj_layout *p = (struct obj_layout *)calloc(1, size);

           return (id)(p + 1);

}

          alloc类方法用struct obj_layout中的retained整数来保存引用计数(接下来另写文章介绍),并且将其写入对象内存头部,该对象内存块全部置0后返回。

相关文章

  • iOS_Objective-C探究alloc方法的实现

    OS X,iOS中的大部分作为开源软件公开在 Apple Open Source上。虽然想让大家参考NSO...

  • alloc和new的区别

    在NSObject.mm文件中可以找到alloc方法和new方法的实现 alloc参数allocWithZone ...

  • alloc探究

    关于alloc后指针内存 首先,我们先创建3个不同指针,并且打印他们的内存地址 打印结果如下: 我们发现,三个指针...

  • alloc的探究

    alloc 分析 对于alloc 系统会创建一个内存对象,并在栈中创建一个对象指针只想对象的地址空间。init操作...

  • iOS 底层探究之 alloc

    我们通过几个问题来探究下一个iOS如何获取到一个对象: alloc和init的区别? alloc方法做了哪些事情?...

  • 01-OC对象的本质

    探究:1.objc_alloc流程2.init操作3.开辟内存 alloc开辟内存. objc_alloc流程1....

  • iOS底层探究-04:NSObject的alloc源码分析

    在上篇文章我们探究了自定义类的alloc源码,接下来我们探究下NSObject的alloc源码,我们会发现她并不会...

  • iOS之OC底层alloc流程

    引言 在实际iOS开发中我,我们经常会调用alloc 方法,然而对于alloc方法的底层实现原理,大部分人并不是很...

  • 《OC底层系列》- 配置可编译运行的objc4源码

    前言 我们想要了解OC的底层是如何实现的,比如alloc背后的的实现流程,我们如何去探究?总结了一下有几下几种办法...

  • 看透构造方法

    构造方法 new方法的内部就是先调用alloc方法,再调用init方法alloc方法:那个类接受alloc消息,那...

网友评论

      本文标题:iOS_Objective-C探究alloc方法的实现

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