ios内存管理

作者: ttcloud | 来源:发表于2017-03-09 17:08 被阅读24次

一、内存管理的对象

内存管理的对象有两种:
1.值类型:基本数据类型,如常量,结构体,枚举等
2.引用类型:继承自NSObject的所有对象
值类型不需要手动管理内存,但是引用类型需要我们手动管理内存
值类型存储在栈区,依次紧密排列,在内存中占有连续的内存空间,遵循先进后出的原则
引用类型存储在堆区,分配内存空间时,会随机从内存中开辟空间,对象与对象间会存在不定大小的空白空间,因而会产生很多内存碎片
值类型转换为引用类型过程叫做装箱,如Int转换为NSNumber
引用类型转换为值类型过程叫拆箱,期间要注意数据原始数据类型,否则容易出现安全性问题
手动拆箱和装箱都会增加程序运行时间,降低性能

二、管理内存的方式

1.MRC手动内存管理:alloc/retain后都要release;引用计数为0时,需要回收内存,不然会造成内存泄漏;为防造成野指针,在释放的时候要将指针置为nil
2.ARC自动管理内存:只要没有强引用指向对象,对象就会被释放;不允许使用retain,release,retainCount等方法;如果使用dealloc时,不能调用[super dealloc]方法

三、与内存管理有关的修饰符

1.readwrite/readonly

readwrite:可读可写,系统会创建相应的getter和setter方法
readonly:只读,系统会创建相应的getter方法,没有setter
系统默认为readwrite

2.alloc|strong|weak|assign|retain|copy|release|autorelease

alloc:alloc是类方法,只能类调用,每次调用都会开辟一块新的内存空间,并使这块新的内存空间的引用计数由0变为1,新的内存空间彼此没有必然联系
strong:相当于MRC下的retain,针对对象类型进行内存管理;当给对象使用此修饰符时,setter方法会将旧对象属性先release,再对新对象赋值并retain
weak:相当于MRC下的assign,但assign在直接赋值情况下可能会出现野指针,而weak会直接置为nil
assign:用于基本数据类型(NSInteger和CGFloat)和C数据类型(如int, float, double, char等)另外还有id类型,如果是对象类型,用此修饰符则可能导致内存泄漏或EXC_BAD_ACCESS
retain:retain是实例方法,只能由对象调用,retain后引用计数加1,但是不会开辟新的内存空间

对象2=[对象1 retain]:表示对象2也拥有这块内存所有权
对象2=对象1:只是简单赋值,当对象1释放的时候,对象2会变为野指针

copy:copy是实例方法,只能由对象调用,返回一个新对象,copy后会开辟一块新的内存区域,旧内存地址引用计数不会变化

浅拷贝类同retain,只是拷贝地址
深拷贝拷贝内容,会开辟新的内存区域
真正深拷贝是针对于容器(NSArray,NSDictionary,NSSet等)而言,普通深拷贝只会拷贝这个对象,而不会对对象元素有任何操作。真正深拷贝会拷贝对象以及对象里面的元素

release:实例方法,只能由对象调用,release使引用计数减1,如果引用计数为0释放内存,如果为0时释放就会造成崩溃
autorelease:实例方法,只能由对象调用,作用相当于延迟的release,在程序走到自动释放池时执行

视图类:当子视图添加到父视图上时,子视图引用计数加1,移除时减1,若父视图释放,父视图上面的子视图引用计数都会减1
容器类(字典,数组,集合):添加元素到容器中,元素的引用计数加1,移除减1;若容器释放,容器里元素的引用计数都会减1
3.原子性修饰符;atomic|nonatomic

atomic:线程安全,系统默认
nonatomic:非线程安全
参考
Objective-C内存管理的对象
浅谈iOS内存管理机制

相关文章

网友评论

    本文标题:ios内存管理

    本文链接:https://www.haomeiwen.com/subject/mpomgttx.html