内存管理
来源:互联网 发布:微型投影仪知乎 编辑:程序博客网 时间:2024/05/17 03:27
内存管理
防止App内存泄露
1、引用计数:
1)每个对象有一个整数值,这个整数值与对象本身关联,称为引用计数器
2)当某些地方需要使用这个对象时,可以将引用计数器加1,表示需要使用这个对象
3)使用完毕之后,若该对象的引用计数器减1,表示该对象已经使用完毕
4)如果引用计数器值为0时,表明没有地方再使用该对象,这是系统将销毁该对象,其所占用内存被收回,以便重用
注:引用计数是判断这个对象是否被销毁的依据(引用计数为0的时候被销毁)
2、ARC、MRC
ARC:自动管理引用计数(系统默认,当前实际开发全部使用的是ARC)
MRC:手动管理引用计数
除了基本数据类型,都用retain:
nonatomic:非原子性,在多线程的情况下,不保证在不同线程数据的安全
atomic:原子性,在多线程里面,保证数据的安全
例:
在ARC情况下:
1)如果这个对象在内存不足的时候允许它被销毁掉,我们用unsafe_unretained
2)如果这个对象在内存不足的时候不允许它被销毁掉,我们用strong
3、怎样去操作引用计数
1)引用计数+1:alloc, new, copy, retain
例:
2)引用计数-1:release,autorelease
例:
3)销毁对象的时候会调用delloc(当引用计数为0的时候,就会调用delloc方法)
4、delloc调用:
1)delloc不可以直接调用,是系统自动调用的。
2)对象引用计数为0(对象已经被释放)的时候,对象是一个野指针(没有指向任何东西的指针),如果使用这个野指针再去调用方法,或者其他操作,会直接崩溃,或者存在潜在危险(数据为空)。
3)如果对象的引用计数为0,就不要强制给这个对象retain。
5、不用我们管理引用计数:
1)分配在栈里面的数据
2)不是我们alloc, new, copy, retain这些操作的
注:谁分配,谁负责释放(分配在堆里面的数据,需要程序员去管理内存)
6、延迟释放:autorelease
1)autorelease通常和自动释放池配合使用
作用:当不知道什么时候对象不需要使用,就可以使用autorelease延迟释放(放到制动释放池里面)
2)写法:
写法一:NSAutoreleasePool(自动释放池的类)
写在自动释放池生命周期以内的,带有延迟释放的对象,都会在释放池生命周期结束之后释放
例:
写法二:@autoreleasepool
@autoreleasepool的生命周期是{},出了大括号,自动释放池结束,会触发大括号里面所有的autorelease
例:
7、属性setter, getter方法的内存管理
8、retain与copy的区别
retain:是给原来对象的引用计数+1
copy:会生成一个新的对象,给新的对象引用计数+1
9、自定义拷贝
1)除了字符串、数组、字典、NSNumber,都要自定义拷贝的功能(遵守拷贝协议)
10、深浅拷贝
深拷贝:完全拷贝一个对象,这个对象与原来的对象完全是两个个体
浅拷贝:值拷贝对象本身,不拷贝对象里面的内容
1)判断深浅拷贝的依据:看它们(不止对象本身,也包含对象里面具体的内容)的内存地址是否一样
2)copy:系统默认的是浅拷贝
3)深拷贝mutableCopy,数组实现深拷贝copyItems,如果设置为YES就是深拷贝
例(字典实现深拷贝):
11、深拷贝的其他方式:
sqlite3(数据库)、coreDara、plist、归档、文件操作
12、如果想要让一个不可变对象变成可变对象,可以使用mutableCopy
例:
13、如果对一个可变的对象进行copy,它将变成一个不可变的对象
例:
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- 内存管理
- C#趣味程序---个位数为6,且能被3整出的五位数
- eclipse安装Spring插件
- DesignMode设计时
- 二叉树完整练习
- 期末模拟——职工工资统计(结构体)
- 内存管理
- Git魔法
- 南阳264 国王的魔镜
- Oracle开发人员守则
- TextView显示html图片的方法
- 黑马程序员-c语言-通讯录的实现
- Exploit writing tutorial part1: Stack Based Overflows
- 程序包
- 大数据下的sql语句使用