iOS -autorelease原理

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

例:

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

1672235-80520a05a82b0120.png
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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值