ios应用程序出现Crash(闪退),大多是内存的原因 内存问题基本体现在两个方面:内存溢出,野指针
IOS给每个引用程序提供一定的内存,用于程序的运行 , 一旦你用的超出给定的内存,就会Crash
野指针:对象内存空间已经被系统回收,仍然使用指针操作这块内存.野指针异常是Crash的主要原因
内存管理的方法:垃圾回收(Java用的这种方式) MRC 手动引用计数 ARC 自动引用计数
iOS的内存管理是:ARC和MRC MRC的内存管理机制:引用计数 ARC是基于MRC的
不过苹果还是会用到垃圾回收机制的 手机ios 引用计数 电脑mac - ox 是有垃圾回收机制的
OC采用引用计数机制来管理内存,当一个新的引用指向对象时,引用计数器就递增,当去掉一个引用时,引用计数就递减.当引用计数到0时, 该对象就将释放占有的资源.
影响引用计数的方法:
alloc 开辟空间,引用计数从0变成1
retian 引用计数加1
copy 引用计数是由你自己实现方法时觉得的
release 引用计数-1
autorelease 在未来的某个时间引用计数-1
-dealloc是继承自父类的方法,当对象计数为0的时候,由对象自动调用
@autoreleasepool()替代. 可以将autorelease写在里面
内存管理的原则: 引用计数的增加和减少相等,当引用计数降为0之后,不应该再使用这块内存空间. 凡是使用了alloc,retain或者copy让内存的引用计数增加了,就需要使用release或者autorelease让内存的引用计数减少.在一段代码内,增加和减少的次数要相等.
copy:伪拷贝 拷贝完还是一个对象(直接返回)
浅拷贝: 拷贝后有两个对象 但是他们的值是同一个
深拷贝 拷贝出新对象 并且对象值也重新拷贝一份 再拷贝
对字符串进行拷贝 拷贝的结果 要看字符串这个类如何实现的拷贝方法 对不可变字符串的拷贝 其实相当于直接retain一次
可变字符串拷贝的时候就是真拷贝了一个新出来的