MRC环境下block内存泄漏问题

在以前,MRC环境下,使用block很可能会出现内存泄漏问题,并且在以往的面试中,一些接触比较久的程序员都会喜欢问到这个问题,block内存泄漏的问题!

下面,我来介绍一下,MRC下Block内存泄漏的一个问题

先随意创建一个Dog类,并创建int类型age属性,

然后在main函数中,创建下列代码,

import “Dog.h”

int main(int argc, const char * argv[]) 
{

@autoreleasepool {
    Dog *d = [[Dog alloc] init];
    d.age = 20 ;
    void(^block)() = ^{
        NSLog(@"%d",d.age);
    };

    block();
    [d release];
}

}

这个时候是正常情况,但是,如果添加如下第10行代码:

int main(int argc, const char * argv[]) 
{

@autoreleasepool {
    Dog *d = [[Dog alloc] init];
    d.age = 20 ;
    void(^block)() = ^{
        NSLog(@"%d",d.age);
    };
    Block_copy(block);
    block();
    [d release];
}

}

此时此刻,有人想对block进行release,但是不管你是否对block进行release ,都无法释放d对象。为什么呢??

这个时候,我们就要对block进行分析了:

1.默认情况下, block的内存是在栈中

* 它不会对所引用的对象进行任何操作

2.如果对block做一次copy操作, block的内存就会在堆中

* 它会对所引用的对象做一次retain操作
* 非ARC : 如果所引用的对象用了__block修饰, 就不会做retain操作
* ARC : 如果所引用的对象用了__unsafe_unretained\__weak修饰, 就不会做retain操作

所以,只需要在Dog类前面加上__block即可!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值