1.arc 和 mrc
1.为什么要进行内存管理
mrc 手动管理内存机制
1.使用alloc开辟内存空间
2.只有在堆区的需要管理
3.采用引用计数机制来管理
4.是引用计数增加到方法有alloc retain copy 向容器内添加元素,add方法等也会让引用计数增加
5.减少引用计数的方法有 release autorelease 还有容器移除元素的方法remove等
6.真正释放对象的方法为dealloc当一个对象的引用计数为1 的时候,再调用release 或者autorelease 的时候,系统自动触发dealloc,释放对象
7.当一个对象通过属性修饰词(copy retain retain )来获得其他内存空间所有权的时候,也要在这个对象释放的时候把这些空间的所有权一起释放
8.谁开辟的谁管理例如便利构造器 没有使用alloc开辟内存空间,所以我们不会对便利构造器创建的对象release 但是便利构造器对象仍需要释放,在便利构造器封装的方法里边自动封装了autorelease
mrc下,我们采用alloc方法会为一个对象开辟内存空间,那么这块内存空间就需要我们来管理,alloc是在堆区开辟的,其他几个分区不需要我们去管理,其中一个对象的生命周期当中,有可能这块内存空间有多个拥有者,而我们采用引用计数的形式来管理这块内存空间的所有者,其中alloc retain copy 会让引用计数增加。release 和autorelease会让引用计数减少
属性的 内存管理
1.assign :简单的赋值,不牵扯内存管理
2.retain 在属性赋值的时候,不仅能得到对象的内容,还可以得到对象的所有权
3.copy 分为深copy 和 浅copy
<1>深拷贝:重新开辟一块内存空间,把原来的值拷贝到新的内存空间上,这样拷贝出来的对象和原对象相比是两个对象,都需要做内存管理,相当于克隆人一样
<2>浅拷贝 拷贝的对象的指针,就是重新创建了一个指针,这个 指针还是指向原来的内存地址所以拷贝出来的对象和源对象是一个对象
os应用程序,上线有内存要求,当程序运行的时在内存中超过20m就会受到内存警告,超过30m就会闪退,所以需要内存管理
内存管理分为两种机制:
arc 自动管理内存机制
仍然需要内存管理,只不过内存管理交给了编译器自己去做管理。编译器会根据对象的引用计数来判断,当一个对象没有所有者的时候,就会自动被释放掉在 arc下不使用 assign retain 使用weak strong
拓展:
在arc中
weak相当于 assign 但是weak 可以自动指向nil 防止野指针
strong相当于 retain