1、Objective-C内存管理的对象程序员
1. 值类型:好比int、float、struct等基本数据类型。算法
- 值类型会被放入栈中,在内存中占有一块连续的内存空间,遵循先进后出的原则,故不会产生碎片。
- 由系统分配管理
2. 引用类型:Objective-C的对象安全
- 引用类型会被放到堆中,内存分配按照必定的分配算法,但不管算法多优,总会产生碎片。
- 内存的分配和释放由程序员操做管理
3. 值类型和引用类型之间的相互转化多线程
- 装箱:把值类型转化为引用类型的过程叫作装箱,如把int包装为NSNumber。
- 拆箱:把引用类型转为值类型的过程叫作拆箱,如把NSNumer转为int。
2、Objective-C内存管理的对象的方法性能
1. 引用计数atom
- 表示对象被引用的次数,经过它能够判断对象是否被回收。
- 若是引用计数为0,对象回收,不为0则不回收。
- 当对象执行alloc、new、copy或者retain时,引用计数加1,release时,引用计数减1。
3、Objective-C管理内存的方式线程
1. 手动内存管理机制:MRC设计
- MRC模式下,全部的对象都须要手动的添加retain、release代码来管理内存。
- 使用MRC,须要遵照谁建立,谁回收的原则。也就是谁alloc,谁release;谁retain,谁release。
- 当引用计数为0的时候,必须回收,引用计数不为0,不能回收,若是引用计数为0,可是没有回收,会形成内存泄露。若是引用计数为0,继续释放,会形成野指针。为了不出现野指针,咱们在释放的时候,会先让指针置为nil。
2. 自动内存管理机制:ARC指针
1)ARC模式下的property变量修饰词对象
- 强引用strong:至关于retain,使用以后,计数器值+1。
- 弱引用weak:至关于assign,使用不会改变计数器的值,指针指向的地址被释放后,会自动置为nil。
- retain:引用计数值+1,即对象持有者的个数+1。
- assign:设置变量时使用,不设计引用计数。
- copy:拷贝对象。
- readwrite与readonly:限制访问者的权限。
- atomic与nonatomic:原子操做与非原子操做。原子操做适用于多线程,对共享资源的安全访问。非原子操做多用于非多线程,能够提升性能。
2)自动释放池
自动内存释放使用@autoreleasepool关键字声明一个代码块,若是一个对象在初始化时调用了autorelase方法,那么当代码块执行完以后,在块中调用过autorelease方法的对象都会自动调用一次release方法。这样一来就起到了自动释放的做用,同时对象的销毁过程也获得了延迟(统一调用release方法)。
- autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中;
- 自动释放池实质是当自动释放池销毁后调用对象的release方法,不必定就能销毁对象(例如若是一个对象的引用计数器>1则此时就没法销毁);
- 因为自动释放池最后统一销毁对象,所以若是一个操做比较占用内存(对象比较多或者对象占用资源比较多),最好不要放到自动释放池或者考虑放到多个自动释放池;
- ObjC中类库中的静态方法通常都不须要手动释放,内部已经调用了autorelease方法;