iOS基础知识5
来源:互联网 发布:java jdk 7 64位下载 编辑:程序博客网 时间:2024/06/06 05:58
一、objc使用什么机制管理对象内存?
通过retainCount的机制来决定对象是否需要释放。每次RunLoop的时候,都会检查对象的retainCount,如果retainCount 为0,说明该对象没有地方需要继续使用了,可以释放掉。
二、ARC通过什么方式帮助开发者管理内存?
ARC相对于MRC,不是在编译时添加retain、release、autorelease这么简单。应该是编译期和运行期两部分共同帮助开发者管理内存。
在编译期,ARC用的是更底层的C接口实现的retain、release、autorelease,这样做性能更好,也是为什么不能在ARC环境下手动retain、release、autorelease。
ARC也包含运行期组件,这个地方做的优化比较复杂,但也不能被忽略。
三、不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?(比如在一个VC的viewDidLoad中创建)
分两种情况:手动干预释放时机、系统自动释放。
手动干预释放时机就是指定autoreleasepool:当前作用域大括号结束时释放。
系统自动去释放:不手动指定autoreleasepool。Autorelease对象出了作用域之后,会被添加到最近一次创建的自动释放池中,并会在当前的RunLoop 迭代结束时释放。
1、从程序启动到加载完成是一个完整的运行循环,然后会停下来,等待用户交互,用户的每一次交互都会启动一次运行循环,来处理用户所有的点击事件、触摸事件。
2、我们都是知道: 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中。
但是如果每次都放进应用程序的 main.m中的 autoreleasepool 中,迟早有被撑满的一刻。这个过程中必定有一个释放的动作。何时?
在一次完整的运行循环结束之前,会被销毁。
3、那什么时间会创建自动释放池?运行循环检测到事件并启动后,就会创建自动释放池。
4、子线程的RunLoop默认是不工作,无法主动创建,必须手动创建。
5、自定义的NSOperation和NSThread需要手动创建自动释放池。比如: 自定义的 NSOperation 类中的 main 方法里就必须添加自动释放池。否则出了作用域后,自动释放对象会因为没有自动释放池去处理它,而造成内存泄露。
但对于blockOperation和invocationOperation这种默认的Operation ,系统已经帮我们封装好了,不需要手动创建自动释放池。
6、@autoreleasepool当自动释放池被销毁或者耗尽时,会向自动释放池中的所有对象发送release消息,释放自动释放池中的所有对象。
__weak id reference = nil;- (void)viewDidLoad { [super viewDidLoad]; NSString *str = [NSString stringWithFormat:@"sunnyxx"]; // str是一个autorelease对象,设置一个weak的引用来观察它 reference = str;}- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSLog(@"%@", reference); // Console: sunnyxx}- (void)viewDidAppear:(BOOL)animated {[super viewDidAppear:animated]; NSLog(@"%@", reference); // Console: (null)}
手动干预释放:
- (void)viewDidLoad {[super viewDidLoad]; @autoreleasepool { NSString *str = [NSString stringWithFormat:@"sunnyxx"]; } NSLog(@"%@", str); // Console: (null)}
四、BAD_ACCESS在什么情况下出现?
1、访问了野指针,比如对一个已经释放的对象执行了release、访问已经释放对象的成员变量或者发送消息。
2、死循环。
五、苹果是如何实现autoreleasepool的?
在没有使用@autoreleasepool的情况,autorelease对象是在当前RunLoop迭代结束时释放。
如果是手动创建@autoreleasepool,自己创建Pool并释放。
- iOS基础知识5
- iOS 基础知识
- iOS基础知识
- IOS基础知识
- ios基础知识
- ios基础知识
- IOS基础知识
- ios基础知识
- IOS基础知识
- iOS 基础知识
- IOS-基础知识
- ios基础知识
- iOS基础知识
- iOS基础知识
- UIButton - iOS - UI基础知识总结5
- IOS开发基础知识要点
- ios开发一些基础知识
- ios 内存管理基础知识
- 回调模式
- PostgreSQL的存储过程简单入门
- Raspbian更新源
- jsp文件中引入js、css文件失败问题
- 本地存储的使用跟删除
- iOS基础知识5
- ucos-iii学习之前后台系统
- React: 傻瓜/展示性组件的简化 (函数型组件及其传参)
- 浏览器开发前端工程,刷新缓存问题
- 隐藏元素后占的空间没有改变
- spring+ehcache集群
- Nginx初始及优化参数及Tomcat优化
- vue2.0 组件之间的通信
- CSDN到底要多少积分才有排名(图解)