首先明确一点什么是自动引用计数
自动引用计数器是在ios5以后增加的一项内存管理机制,是指内存管理中对引用采取自动计数的一项技术,让编译器来进行内存管理。
在LLVM编译器中设置ARC为有效状态,就无须再次键入retain、release
</br>
内存管理的是思考方式
- 自己创建的对象,默认自己持有
- 非自己创建的对象,retain后也能够持有
- 自己持有的对象,在不需要的时候需要释放
- 不是自己持有的对象,不能释放
</br>
那么什么才叫做是“自己创建”的类呢?
使用以下名称开头的方法意味着是自己创建的对象并持有的对象:
1. alloc
2. new
3. copy
4. mutableCopy
另外根据类似“使用以下名称开头的方法名”(实现方法中是以上述方法重写),下列名称也意味着自己创建自己持有。
1. allocMyObject
2. newTheClass
3. copyThis
4. mutableCopyThat
自己创建的对象,自己持有,自己释放
/*
* 创建时
*/
//自己生成对象并持有对象
id obj = [[NSObject alloc] init];
/*
* 持有对象
*/
// 自己创建不需要retain就已经持有
/*
* 释放时
*/
//自己创建的对象,需要自己去释放
[obj release];
// 释放后的 指向对象的指针依然保存在对象obj中,但一旦释放绝对不能再访问
非自己创建对象,在持有后,可以释放
/*
* 创建时
*/
//取得非自己生产的对象,但暂时并不持有
id obj = [ NSArry arry ];
/*
* 持有对象
*/
[obj retain];
/*
* 释放对象
*/
//对自己持有的对象,如果不需要再使用,持有者需要去释放
[obj release];
非自己持有的对象,不能去释放
- (id)object{
/*
* 自己持有对象
*/
id obj = [[NSObject alloc] init ];
/*
* 取得的对象存在, 但自己不持有对象
*/
//需要使用到autoRelease是因为obj需要在没有持有的状态下被释放,而现在我们设计object方法所创建的对象是不持有的,这样就说明最后retain的对象是无法主动release obj。所以需要借助autoRelease来释放obj,这样既延长了obj的生命周期,又保证在不需要的时候释放obj
[obj autoRelease];
return obj;
}
NSMutableString *mStr = [NSMutableStringstringWithFormat:@"abc"];
NSLog(@"mStr:%p,%p", mStr,&mStr);
//mstr 打印%p输出的是 mstr指向的是@“abc”的首地址
//&mStr 输出的是mstr自己保存在内存中的地址