ios学习路线—Objective-C(MRC)
2016-06-15 02:02
579 查看
Reference Count引用计数
Cocoa采用了引用计数机制,每一个对象有一个关联的整型retainCount用于记录对象的使用情况。对象被引用时retainCount+1,外部环境结束对象的使用后retainCount-1,当 retainCount为0的时候,该对象被销毁。
Objective-C对象的动作对应有哪些方法以及这些方法对引用计数有什么影响?
![](http://img.blog.csdn.net/20160614234821509)
内存管理原则:谁创建,谁释放,谁引用,谁管理
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。
例子如下:
为什么需要autorelease
1.很多C/C++转过来的程序员会说,这个auto release有什么好,象C/C++那样,自己申请,自己释放,完全可控不好么, 这个auto relase 完全不可控,你都不知到它什么时候会被真正的release。 我的理解它有一个作用就是可以做到每个函数对自己申请的对象负责,自己申请,自己释放,该函数的调用者不需要关心它内部申请对象的管理。 在下面这个例子中,Func1的调用者不需要再去关心obj的释放。
实际上对于 [NSString stringWithFormat:] 这类构造函数返回的对象都是autorelease的。
2.autorelease pool来避免频繁申请/释放内存(就是pool的作用了)。这个应该是相对比较好理解的。
总结:
1.一定要注意Autorelease pool的生存周期,理解Runloop,避免在对象被释放后使用。
2.[NSString stringWithFormat:]这类函数返回的对象是不需要再自己release的,它已经被autorelease了, 如果你想把它当一个全局对象使用,那必须自己再retain, 释放时再release。
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。
相关文章推荐
- iOS---Objective-C中@class与#import的区别
- ios学习路线—Objective-C(代码规范)
- @dynamic
- Objective-C中将结构体与联合体封装为NSValue对象
- Object类源码解析
- Android Sharepreference保存Object或者ListObject
- Objective-C图片切圆角优化
- Xcode常用快捷键
- AFNetWorking之GET,POST,上传图片,下载文件进度监测
- 深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置
- Javascript Object的使用方法 ( 内含遍历Object属性的操作!)
- tsql default values, check current isolation level, check db object last update time
- Training Region-based Object Detectors with Online Hard Example Mining
- ValueAnimator及ObjectAnimator的使用
- 用Qt Designer创建ui后,记得修改objectName
- Objective-C文件和目录操作,IOS文件操作,NSFileManager使用文件操作
- mock.patch.object方式写UT
- Python标准库:内置函数hasattr(object, name)
- Xcode报错Expected selector for Objective-C and Expected method body
- Objective-C --- - UITableView 三 自定义cell(梳理总结)