iOS中内存管理问题

mrc

在学习的时候一致有一个地方不理解,为什么变量retain之后又release,现在算是明白了:

- (void)setFoo:(Foo *)foo{
    if (_foo != foo) {
    //_foo是当前实例变量,foo为传入的参数,两者是不同的实例变量,指向不同内存空间
     [_foo release];
    //把_foo引用计数减1后为零,把指向的内存空间释放,而foo当前是被autoRelease的,实际引用计数为1,但之后自动为0
        _foo = nil;
        //提高安全性
        _foo = [foo retain];
        //把foo指向的内存空间引用计数加一,把_foo的指向到foo的内存空间,即现在两者指向同一个地址,如果此时不retain之后_foo和foo指向的内存会被释放
    }
}

抛出异常

mrc下try块内创建了对象,必须清理干净:

A *a;
@try {
    a = [[A alloc] init];
}
@catch(...) {
    NSLog(@"Error");
}
@finally {
    [a release];
}

而在arc下,arc并不会自动调用release,所以有可能会造成内存泄漏,这个时候可以开启编译器标志-fobjc-arc-exceptions,但是这么做会导致app变大,降低运行效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值