美文网首页
iOS -autorelease原理

iOS -autorelease原理

作者: 翀鹰精灵 | 来源:发表于2020-01-22 17:32 被阅读0次

Autorelease机制是iOS开发者管理对象内存的好伙伴,MRC中,调用[obj autorelease] 来延迟内存的释放。这里我们通过一个例子,来阐述autorelease到底什么时候释放。

例:

1.新建一个Mac工程。
2.在终端cd到改工程目录main.m文件夹下。
3.执行clang -rewrite-objc main.m命令,改目录下会多一个main.cpp的文件。
4.打开main.cpp文件,main函数编译后如下图所示:

01.png

OC中的代码

Person *person = [[[Person alloc]init]autorelease];

编译后的代码

        /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 
        Person *person = ((Person *(*)(id, SEL))(void *)objc_msgSend)((id)((Person *(*)(id, SEL))(void *)objc_msgSend)((id)((Person *(*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("Person"), sel_registerName("alloc")), sel_registerName("init")), sel_registerName("autorelease"));

在这段代码中,我们可以醒目的看到/* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;,点击查看,我们发现__AtAutoreleasePool是一个结构体。结构体代码如下:

struct __AtAutoreleasePool {
   // 构造函数,在创建结构体的时候调用
  __AtAutoreleasePool() {atautoreleasepoolobj = objc_autoreleasePoolPush();}

   // 析构函数,在结构体销毁的时候调用
  ~__AtAutoreleasePool() {objc_autoreleasePoolPop(atautoreleasepoolobj);}
  void * atautoreleasepoolobj;
};

小结
执行__AtAutoreleasePool __autoreleasepool;
调用__AtAutoreleasePool构造函数;即会调用 objc_autoreleasePoolPush()方法;
执行完Person *person = [[[Person alloc]init]autorelease];函数之后,括号内函数执行完了,即将调用objc_autoreleasePoolPop函数。

所以Person *person = [[[Person alloc]init]autorelease];代码的本质是:

大括号前调用
atautoreleasepoolobj = objc_autoreleasePoolPush();
大括号后调用
objc_autoreleasePoolPop(atautoreleasepoolobj);

伪代码 如下:

int main(int argc, const char * argv[]) {
    @autoreleasepool {
          atautoreleasepoolobj = objc_autoreleasePoolPush();

          Person *person = [[[Person alloc]init]autorelease];

          objc_autoreleasePoolPop(atautoreleasepoolobj);

    }
    return 0;
}

相关文章

  • iOS -autorelease原理

    Autorelease机制是iOS开发者管理对象内存的好伙伴,MRC中,调用[obj autorelease] 来...

  • iOS autorelease与自动释放池

    autorelease、autorelease pool以及原理 autorelease与MRC、ARC auto...

  • iOS autorelease 实现原理及释放时机

    iOS autorelease 实现原理及释放时机 我们见文件转化为 C++ 文件,xcrun -sdk ipho...

  • iOS autorelease的实现原理

    autorelease就是自动释放,会像C语言的自动变量那样来对待对象实例。当超出作用于时,对象实例的releas...

  • Autorelease原理

    ARC下,我们使用@autoreleasepool{}来使用一个AutoreleasePool,随后编译器将其改写...

  • Autorelease 原理

    AutoreleasePoolPage 我们新建一个 Command Line Tool 项目,查看 main.m...

  • autorelease原理

    对象调用autorelease会在它所在的@autoreleasepool{}大括号结束的时候调用release释...

  • Autorelease背后的机制

    autorelease机制是iOS管理对象内存的好伙伴,在MRC时代,我们通过[obj autorelease]来...

  • Autorelease

    Autorelease介绍 Autorelease机制是iOS开发者管理对象内存的好伙伴,MRC中,调用[obj ...

  • Autorelease 探究

    前言 Autorelease机制是iOS开发者管理对象内存的好伙伴,MRC中,调用[obj autorelease...

网友评论

      本文标题:iOS -autorelease原理

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