Objective-C内存管理
来源:互联网 发布:数组排序 编辑:程序博客网 时间:2024/05/07 15:29
内存管理
思路:只把当前参与逻辑的对象留下。
必要性:当应用程序所消耗的内存超过一定的量,iOS会给予2次内存警告,如果内存消耗依然不能减小并超过规定的内存使用范围,iOS系
统会强行终止应用程序,造成闪退的现象。
管理原则:配对原则(只要出现了new,alloc,retain,copy,就一定配对出现一个release,autorelease,保持局部内存管理平衡)
[对象 release];// rc - 1并返回self(对象自身)
[对象 alloc];// rc = 1并返回self(对象自身)
[对象 new];// rc = 1并返回self(对象自身)
[对象 retain];// rc + 1并返回self(对象自身)
[对象 copy];// rc + 1并返回self(对象自身)
MRR Manual retain-release
创建对象
1.分配内存空间,存储对象
2.初始化成员变量
3.返回自身的指针地址(retainCount = 1)//对象在完成创建的同时,内部会自动创建一个引用计数器。这个计数器,是系统用来判断是否回
//收对象的唯一依据。当retainCount = 0时,系统回收对象(调用对象的dealloc方法)
手动管理内存的关键
1.野指针操作(闪退)
2.内存泄露(不再被使用的对象,一直在内存中没有被销毁)
解决方法:
1.避免野指针操作的方法:
如果确定当前作用域中的对象已经不会再被使用,通常会把不在使用的指针变量赋值为nil。
2.内存泄露可能的原因
(1)release次数不够
(2)提前将指针赋值为nil
(3)已销毁的对象,不能通过retain“复活”
set方法模板
if (内部属性 != 传入的对象)//判断是否使用同一对象多次赋值,防止内存泄露
{
[内部属性 release];//将内部属性之前所拥有的对象release,防止内存泄露
内部属性 = [传入的参数 retain];//内部属性拥有新传入的对象,将此对象的rc加1
}
- (void)dealloc
{
[super dealloc];//在对象自身被销毁前,一定先调用[super dealloc]释放父类中的相关对象
[内部属性 release];//释放本类属性相关的对象,防止内存泄露
…//释放对象所有相关的对象
}
自动释放池
对象存入到自动释放池中,此池子被销毁的时候会对池中所有的兑现改进型一次release操作。//可以认为池子是个容器类,比如
//NSMutableArray。
autorelease方法的作用
将对象放入到自动释放池中,然后返回self。
关键:
1.无论对象是否在自动释放池内部创建,只要在其内部对对象发送autorelease消息,就会将对象放入自动释放池中。
2.如果多次将统一对象放入自动释放池,自动释放池就会多次对此对象发送release消息,由此会导致野指针操作的问题。
3.若在快速获取一个对象的类方法中创建一个新对象,一定初始化为nil,防止野指针操作,并使用autorelease,防止内存泄露(系统提供的快速获取对象的方法就是使用autorelease)。
ARC机制
系统释放对象的原则:只要有强指针指向一个对象,那么系统就不会回收该对象。(弱指针不影响对象被回收)
与JAVA垃圾回收的区别:只要没有强指针指向对象,系统就会立即回收该对象。
默认情况下,所有指针都是strong指针
定义弱指针:类型前使用__weak修饰
ARC下不允许使用的关键字:
dealloc,retain,release,autorelease
ARC MRR
strong <———> retain
weak <———> assign
//weak指针所指向的对象被回收后,自动赋值为nil
ARC与MRR共存
设置位置:Build Phases
—> Compile Source
—> 选中需要设置的.m文件
设置项目中MRR的.m文件的编译参数为 -fno-objc-arc
指定此文件是非arc机制。
其他
僵尸对象:被系统回收的对象。
产生原因:默认情况下,XCode为了提高编码效率,不会实时检查僵尸对象。
开启XCode实时监测僵尸对象的功能:
Edit scheme
—>Diagnostics
—>objective-c
—>勾选enable Zombie objects选项
dealloc方法:当一个对象的引用计数等于零的时候,系统会自动调用这个对象的dealloc方法,释放此对象所拥有的所有对象,并收回此对象所占据的内存空间。
类的循环引用问题(双向引用)
解决方法:
1.头文件中使用@class
2.实现文件中再使用import命令导入头文件
3.将依赖方的strong指针修改为weak
- objective-c内存管理
- Objective-c 内存管理
- Objective-C内存管理~~
- Objective-C内存管理
- Objective-C 内存管理
- Objective-C 内存管理
- Objective-C 内存管理
- Objective-C内存管理
- objective-c 内存管理
- objective-c 内存管理
- Objective-C 内存管理
- Objective-C内存管理
- Objective-C 内存管理
- objective-c内存管理
- objective-c内存管理
- Objective-c 内存管理
- Objective-C 内存管理
- Objective-C 内存管理
- java的继承
- Python 数据分析包:pandas 入门
- Ubuntu下安装Windows、Mac主题
- Java中的回车换行符/n /r /t
- 【大数问题】 HDOJ 5047 Sawtooth
- Objective-C内存管理
- ps快捷键
- 使用poi操作excel
- 一键删除文件夹下的.svn文件
- ACM_java输入输出优化
- MySQL基本概念
- 为什么RPP比lua更适合做脚本语言?
- PHP 循环检测并生成目录 chkDir($dirname,$split='/')
- tomcat官方下载