一、理解引用计数
对象的生命周期如下:
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;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。