在MRC(Manual Reference Counting)时代,遵循着“谁创建,谁释放”的原则,创建方法包括alloc, new, copy, mutableCopy以及以它们为前缀的构造方法例如allocWithXXX, copyWithXXX, mutableCopyWithXXX等。
1.当使用以上这些方法创建对象时,创建该对象的指针拥有了该对象的所有权,那么就有义务必须在合适的时机调用release方法表明自己不再使用它,例如:
/**
* 这些创建的对象在MRC下,都必须在使用完毕后调用release方法
*/
id obj = [NSObject new];
id obj2 = [[NSObject alloc] init];
id obj3 = [obj2 copy];
id obj4 = [obj3 mutableCopy];
id obj5 = [obj4 allocWithString: @"Hello World!"];
2.当使用非上面提到的名称创建对象时,表示通过该方法取得的对象并不被指针所持有,所以也就不用使用release方法来释放它。例如:
/**
* 取得的对象存在,但自己不持有对象
*/
id obj = [NSArray array];
3.非自身创建的对象可以通过retain方法来表明自己也要拥有它的管理权,当使用了retain方法后,那么也有义务必须在不再使用该对象的时候调用release方法。
4.不能对非自身持有并且也没有retain过的对象调用release方法,否则会造成程序崩溃。
5.autorelease方法用于想把对象的生命周期交给自动释放池(autorelease pool)时使用,例如:
- (instancetype)object {
id obj = [[NSObject new] autorelease];
return obj;
}
6.Foundation框架和CoreFoundation框架的类是非常相似的,所以可以相互转换。但是因为iOS5引入了ARC(Automatic Reference Counting)机制,Foundation框架可以使用ARC,所以在转换时涉及到了内存管理方法的变化了,以NSString为例:
将NSString转为CFStringRef:
NSString *string = [NSString stringWithFormat:...];
CFStringRef cfString = CFBridgingRetain(string);// 相当于 (__bridge_retained CFStringRef)string,就是将string对象转换后主动调用了一次CFRetain方法
...
CFRelease(cfString); // 由于Core Foundation不在ARC管理范围内,所以在使用完毕需要主动release。
将CFStringRef转为NSString:
CFStringRef cfString = CFStringCreate...();
NSString *string = (__bridge_transfer NSString *)cfString;
/** __bridge_transfer关键字就相当于将cfString release了一次,
并且将转换的NSString对象传给了string指针,
由于是ARC下NSString *默认就是__strong NSString *,
所以__strong的作用就是主动将该对象retain一次,这样就完成了类型转换
*/