码迷,mamicode.com
首页 > 移动开发 > 详细

IOS阶段学习第20天笔记(OC中的内存管理)

时间:2015-07-12 15:39:37      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

IOS学习(OC语言)知识点整理

 

一、OC中的内存管理

1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int 、float、double...)无效
      OC中采用引用计数器对内存做管理,他是一个整数数据,表示对象引用的次数,每个对象分配4字节
      的内存空间存放引用计数器。当一个对象的引用计数器为0时 它将被自动释放,反过来说 当使用alloc、
      new 、copy(mutableCopy)创建新对象时,引用计数器默认为1

2)黄金法则 当使用alloc、new 、copy(mutableCopy)创建一个对象赋值给某个引用时后当不再使用这
      个引用时一定要发送release(autoRelease)消息 释放该对象所占用的内存。

3)这里所讲的内存管理为手动内存管理,新建项目是系统默认是自动内存管理的,所以需要手动设置,即在项目
      的Build  Settings 中找到 Objective-C Automatic Reference Counting 项设置为NO; 同时需要添加对野指
      针的监控 即在Edit Scheme 中找到并勾选 Enable Zoombie Objects 项。

3)内存管理操作 实例代码:

  1、添加一个Person类 .h文件中不做任何操作

  2、在.m 文件中析构系统销毁内存执行方法  例如: 

1 #import "Person.h"
2 @implementation Person
3 //析构系统销毁内存执行方法
4 -(void)dealloc{
5      NSLog(@"Person dealloc");
6 }
7 @end 

  

3、在main文件中执行操作 例如:

Person *p1=[[Person alloc]init];//引用计数器默认+1
[p1 retain]; //引用计数器+1

NSLog(@"retainCount:%ld",p1.retainCount);//结果:2
[p1 release];//引用计数器-1

//retainCount 获取引用计数器的个数
NSLog(@"retainCount:%ld",p1.retainCount);//结果:1
[p1 release];
NSLog(@"retainCount:%ld",p1.retainCount);//结果:0


4)在使用组合类是销毁自身对象时需要先销毁组合的对象 ,即在析构方法中销毁组合对象 例如:

1  //Person 类中有一个Book 类 在Person类的.m文件中添加此方法
2    -(void)dealloc{
3         [_book release];
4        NSLog(@"Person dealloc");
5     }


5)组合类初始化时需要在父类中添加set方法用于在给组合类赋值时增加引用计数器个数 例如: 

1     //Person 类中Book类的赋值方法
2      -(void)setBook:(Book*)book{
3        book=[book retain];
4      }
5 
6      //Person 类中Book类的取值方法
7       -(Book*)book{
8           return _book;
9      }

 
6)数组中的内存管理:销毁数组对象时需要先销毁数组中存放的对象 例如:

 1 NSMutableArray *array=[[NSMutableArray alloc]init];
 2 NSLog(@"%ld",array.retainCount);
 3 for (int i=0; i<5; i++) {
 4  Book *b=[[Book alloc]init];
 5  b.ID=i+1;
 6  [array addObject:b];
 7 }
 8 NSLog(@"before array %ld",array.retainCount);//结果:1
 9 for (int i=0; i<array.count; i++) {
10   [array[i] release];
11 }
12 [array release];
13 NSLog(@"after array %ld",array.retainCount);//结果:0

 

 7)循环引用的内存管理:针对循环引用时我们必须将其中一个对象类型由retain 改为assign 类型
       否则将无法彻底释放内存。

8)autorelease 自动释放池 :将对象放入一个自动释放池中,当自动释放池被销毁时,会给池子中
      所有的对象发送 release消息autorelease 方法返回对象本身给对象发送autorelease 消息后引用
      计数器值不变

IOS阶段学习第20天笔记(OC中的内存管理)

标签:

原文地址:http://www.cnblogs.com/ChinaKingKong/p/4640979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!