内存管理

来源:互联网 发布:微型投影仪知乎 编辑:程序博客网 时间: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,它将变成一个不可变的对象

例: 







0 0
原创粉丝点击