MRC和ARC
2016-05-30 17:00
281 查看
MRC
Manul(手动) Reference(引用) Counting(计数)什么是手动引用计数?
通过release和retain手动管理程序的内存
内存管理的原则就是有加就有减
也就是说, 一次alloc对应一次release, 一次retain对应一次relese
多个对象的内存管理
当B对象成为A对象的属性时,A对象要对B对象进行一次retain确保B对象是存在的 当A对象释放时,要对所持有的对象属性进行release,避免内存泄露自动释放池
方法一@autoreleasepool { Person *p = [[Person alloc] init]; p = [p autorelease]; // 标记p加入释放池 [p run]; //写法2 Person *p = [[Person alloc] init] autorelease]; [p run]; } //被标记的对象 自动释放池会自动发送release
方法二
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; Person *p = [[[Person alloc] init] autorelease]; [p run]; // 销毁一个自动释放池 [pool release];
一个程序中可以创建N个自动释放池, 并且自动释放池还可以嵌套
如果存在多个自动释放池的时候, 自动释放池是以 “栈” 的形式存储的
栈的特点: 先进后出
给一个对象方法发送一条autorelease消息, 永远会将对象放到栈顶的自动释放池 @autoreleasepool { 创建第一个释放池 @autoreleasepool { 创建第二个释放池 @autoreleasepool { 创建第三个释放池 Person *p = [[[Person alloc] init] autorelease]; [p run]; } 第三个释放池销毁 Person *p = [[[Person alloc] init] autorelease]; } 第二个释放池销毁 } 第一个释放池销毁
Foundation框架的类, 但凡是通过类工厂方法创建的对象都是autorelease的
Person *p = [[[Person alloc] initWithAge:30] autorelease]; Person *p2 = [[Person person] autorelease];
ARC
Automatic(自动) Reference(引用) Counting(计数)什么是自动引用计数?
不需要程序员内存, 编译器会自动添加release/retain等代码
注意点: OC中的ARC和java中的垃圾回收机制不太一样, java中的垃圾回收是系统干得, 而OC中的ARC是编译器干得
僵尸对象: 被释放了的对象
野指针:指向了僵尸对象的指针
为了避免给野指针发送消息会报错, 当一个对象被释放后会设置为空指针(在OC中给空指针发送消息是不会报错的
ARC的判断准则
ARC的判断准则: 只要没有强指针指向对象, 对象就会释放默认情况下所有的指针都是强指针
// 强指针 __strong Person *p = [[Person alloc] init]; // 弱指针 __weak Person *p2 = p; p = nil;
property修饰符
iOS开发中只要写上property, 那么就立刻写上nonatomicreadonly: 只会生成getter方法
readwrite: 既会生成getter也会生成setter,
getter: 可以给生成的getter方法起一个名称
setter:可以给生成的setter方法起一个名称
retain: 就会自动帮我们生成getter/setter方法内存管理的代码
assign: 不会帮我们生成set方法内存管理的代码, 仅仅只会生成普通的getter/setter方法, 默认什么都不写就是assign
多线程 atomic :性能低(默认)
nonatomic :性能高 在iOS开发中99.99%都是写nonatomic
@class
应用场景一1.如果都在.h中import, 假如A拷贝了B, B拷贝了C , 如果C被修改了, 那么B和A都需要重新拷贝. 因为C修改了那么B就会重新拷贝, 而B重新拷贝之后相当于B也被修改了, 那么A也需要重新拷贝. 也就是说如果都在.h中拷贝,只要有间接关系都会重新拷贝
2.如果在.h中用@class, 在.m中用import, 那么如果一个文件发生了变化, 只有和这个文件有直接关系的那个文件才会重新拷贝
3.所以在.h中用@class可以提升编译效率
应用场景二
防止循环引用, (A拷贝B, B拷贝A)
如果在.h中用@class, 不会做任何拷贝, 而在.m中用import只会拷贝对应的文件, 并不会形成死循环
相关文章推荐
- log4j:WARN No appenders could be found for logger
- C# 控制台输出
- Maven入门指南⑦:Maven的生命周期和插件
- MFC HTTP 上传下载
- C#基础之内存分配
- Android 读取assets文件下的txt文件
- c++单例模板
- HDU 1285 确定比赛名次(拓扑排序)
- NSIS静默安装
- eclipse引用库项目
- eclipse 修改后台代码
- 软件工程 —— 个人最终总结
- 用c++实现二叉树的线索化
- 软件工程 —— 个人最终总结
- python3深入学习教程
- 【英语】五月,英语如影随形
- 【java】单例模式
- String 类型 保留后两位小数
- 深入理解python中的浅拷贝和深拷贝
- 最全电商分类信息(11)