iOS中内存管理问题

来源:互联网 发布:苹果手机mac地址修改器 编辑:程序博客网 时间:2024/05/16 01:27

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变大,降低运行效率。

0 0
原创粉丝点击