ios学习路线—Objective-C(MRC)

Reference Count引用计数
Cocoa采用了引用计数机制,每一个对象有一个关联的整型retainCount用于记录对象的使用情况。对象被引用时retainCount+1,外部环境结束对象的使用后retainCount-1,当 retainCount为0的时候,该对象被销毁。
Objective-C对象的动作对应有哪些方法以及这些方法对引用计数有什么影响?
这里写图片描述
内存管理原则:谁创建,谁释放,谁引用,谁管理

Autorelease
autorelease实际上只是把对release的调用延迟了,对于每一个autorelease,系统只是把该object放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有object会被调用release。

对于每一个RunLoop,系统都会隐式创建一个autorelease pool,这样所有的release pool会构成一个像CallStack一样的一个栈式结构,在每一个RunLoop结束时,当前栈顶的autorelease pool会被销毁,这样这个pool里的每个object会被release。
那什么是RunLoop呢?一个UI事件,Timer call,delegate call,都会是一个新的RunLoop。
例子如下:

NSString* globalObject;
-(void)applicationDidFinishLaunching:(UIApplication*)application 
{   
globalObject = [[NSString alloc]initWithFormat:@"Test"];
NSLog(@"Retain count after create:%d", [globalObject retainCount]); // output 1.
[globalObject retain];
NSLog(@"Retain count after retain:%d", [globalObject retainCount]); // output 2.
}
-(void)applicationWillTerminate:(UIApplication *)application
{
//输出1. Button clickloop finished, it's autorelease pool released,globalObject get released once.
NSLog(@"Retain count after Buttonclick runloop finished: %d", [globalObjectretainCount]); 

}
-(IBAction)onButtonClicked
{
[globalObject autorelease];
//输出2。 Autorelease被call,globalObject被加如当前的AutoreleaePool。
NSLog(@"Retain count afterautorelease: %d", [globalObjectretainCount]); 

}

为什么需要autorelease
1.很多C/C++转过来的程序员会说,这个auto release有什么好,象C/C++那样,自己申请,自己释放,完全可控不好么, 这个auto relase 完全不可控,你都不知到它什么时候会被真正的release。 我的理解它有一个作用就是可以做到每个函数对自己申请的对象负责,自己申请,自己释放,该函数的调用者不需要关心它内部申请对象的管理。 在下面这个例子中,Func1的调用者不需要再去关心obj的释放。

ClassA *Func1()
{
    ClassA *obj = [[[ClassA alloc]init]autorelease];
    return obj;
}

实际上对于 [NSString stringWithFormat:] 这类构造函数返回的对象都是autorelease的。

2.autorelease pool来避免频繁申请/释放内存(就是pool的作用了)。这个应该是相对比较好理解的。

总结:
1.一定要注意Autorelease pool的生存周期,理解Runloop,避免在对象被释放后使用。
2.[NSString stringWithFormat:]这类函数返回的对象是不需要再自己release的,它已经被autorelease了, 如果你想把它当一个全局对象使用,那必须自己再retain, 释放时再release。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值