一、理解引用计数

对象的生命周期如下:

1、生成并自己持有对象 引用计数+1

使用alloc、new、copy、mutableCopy名称开头的方法,意味着自己生成的对象自己也持有。

但不是绝对的,如下

NSObject *object= [NSObject new];//retainCount=1

NSArray *object= [NSArray new];//retainCount=-1

2、持有对象(retain) 引用计数+1

3、释放对象(release) 引用计数-1

4、废弃对象 (alloc)

上面的描述用代码表示就清楚了,如下:

NSObject*object = [NSObject new];//1

[object retain];//2

NSLog(@"%d ", object.retainCount);

[object release];//1

NSLog(@"%d ", object.retainCount);

[object release];// 0

//[object release];

二、自动释放池

对象持有引用计数+1,释放引用计数-1,当引用计数=0时,对象释放。貌似很简单,一两句话就可以概括清楚。但是当多个实体拥有某个对象时,对象的所有权就变得复杂了。

  - (NSString*)myString
    {
        NSString *str = [[NSString alloc] initWithFormat:@"test"];
        [str retain];
        return str;
    }
    

像这种情况,究竟谁释放?
如果在myString里面释放。那么myString函数外面就没法使用对象了,因为已经被释放了。
那如何是函数外面释放,意味着调用者要负责处理。这样一来,有点不方便。
所以这时候应该用自动释放(autorelease)来释放对象:

- (NSString*)myString
{
    NSString *str = [[NSString alloc] initWithFormat:@"test"];
    [str autorelease];
    return str;
}


Milu
1.3k 声望22 粉丝

引用和评论

0 条评论