iOS开发中OC对象内存管理小记

在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一次,这样就完成了类型转换
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星仔20180409

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值