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

一、OC中的内存管理

1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int 、float、double...)无效
      OC中采用引用计数器对内存做管理,他是一个整数数据,表示对象引用的次数,每个对象分配4字节
      的内存空间存放引用计数器当一个对象的引用计数器值为0时,它将被释放,反过来说,如果一个对象的
      引用计数器值不为0,这个对象永远不会被释放,除非程序退出。

2) 当给对象发送一个retain消息,引用计数器值会+1,retain消息返回对象本身

3)当给对象发送一个release消息,引用计数器值为-1.

4)给对象发送一个retainCount消息,获取引用计数值
 
5)当对象的引用计数器值为0,会被销毁,内存空间会被释放

6) 当对象被销毁时,系统自动发送一个dealloc消息

7)一般重写dealloc消息,释放相关资源,一旦重写dealloc方法,一定要调用[super dealloc];
      放在最后调用 不能直接调用dealloc方法

8)OC中的内存管理分为:MRC(Manual Reference Counting)手动引用计数
      ARC:Automatic Reference Counting:自动引用计数。
 
9)黄金法则 当使用alloc、new 、copy(mutableCopy)创建一个对象赋值给某个引用时后当不再使用这
      个引用时一定要发送release(autoRelease)消息 释放该对象所占用的内存。

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

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

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

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

 #import "Person.h"
@implementation Person
//析构系统销毁内存执行方法
-(void)dealloc{
NSLog(@"Person dealloc");
}
@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];p1=nil;//防止出现野指针,出现不安全因素 OC中可以给空指针对象发送消息
NSLog(@"retainCount:%ld",p1.retainCount);//结果:0

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

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

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

     //Person 类中Book类的赋值方法
-(void)setBook:(Book*)book{
book=[book retain];
} //Person 类中Book类的取值方法
-(Book*)book{
return _book;
}

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

 Book *b0=[[Book alloc]init];
b0.ID=;
NSMutableArray *array=[[NSMutableArray alloc]initWithObjects:b0, nil];
[b0 release];
NSLog(@"%ld",b0.retainCount);
for(int i=;i<;i++){
Book *b=[[Book alloc]init];
b.ID=i+;
NSLog(@"before,book:%ld",b.retainCount);
[array addObject:b];
NSLog(@"after,book:%ld",b.retainCount);
[b release];
NSLog(@"release,book:%ld",b.retainCount);
}
NSLog(@"%ld",array.retainCount);
[array removeLastObject];
NSLog(@"*******");
[array release];

15)数组对象中计数器的运行机制:

1、当用对象创建数组时,数组会自动给对象的引用计数器+1

2、将对象添加到数组时,数组会自动给对象的引用计数器+1

3、将对象从数组中删除时,数组会自动给对象发送release,将引用计数器值-1

4、当数组release时,会自动给所有的元素发送release消息

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

17)循环引用时可能会出现头文件重复包含的问题 此时我们将#import  改为 @class  例如: @class Person;

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

19)创建自动释放池有2种方法:

 //方法一
@autoreleasepool {} //方法二
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
[pool release];

20)autorelease好处:不用担心对象什么时候被释放;缺点:当对象很大时,不能精确控制对象的释放 ;能不用autorelease尽量不用.

21)自动释放池 实例代码:

 @autoreleasepool {  //自动释放池的开始
Book *b1=[[Book alloc]init];
b1=[b1 autorelease];//返回对象本身
NSLog(@"%ld",b1.retainCount);
b1.ID=;
Book *b5=nil;
@autoreleasepool {
Book *b2=[[[Book alloc]init]autorelease];
b2.ID=;
//[b2 release];//不能,已经有autorelease,在池子被销毁时再次发送release消息,就会出错 //b5=[[[[Book alloc]init]autorelease]autorelease];
//将同一个对象往自动释放池中放入2次,池子被销毁时会发送2次release消息,也会出现野指针错误
b5=[[[Book alloc]init]autorelease];
b5.ID=;
}
//创建自动释放池方法二:
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init]; [pool release];
//NSLog(@"id:%d",b5.ID); Person *p1=[Person personWithAge:];
//p1不需要release,p1的创建没有alloc...关键字,已经在类方法中autoreleas过了
//OC中有很多类提供了快速创建实例的类方法,都是autorelease的 NSLog(@"*********");
Student *stu=[Student personWithAge:];
stu.no=; }//自动释放池结束

22)快速构建对象方法  例如:

 +(id)personWithAge:(int)newAge
{
// p1对象的释放只能通过autorelease实现
//子类继承后也可以用此方法快速创建子类的对象,需要使用self
//(发送消息的引用,如果是父类就是Person,如果是子类就是Student)
Person *p1=[[[self alloc]init]autorelease];
p1.age=newAge;
return p1;
}

iOS阶段学习第20天笔记(MRC内存管理)的更多相关文章

  1. iOS阶段学习第21天笔记(ARC内存管理-Copy-代理)

    iOS学习(OC语言)知识点整理 一.OC 中的ARC内存管理 1)ARC中释放对象的内存原则:看这个对象有没有强引用指向它 2)strong:强引用,默认情况下的引用都是强引用 3) weak:弱引 ...

  2. iOS阶段学习第12天笔记(类的初始化)

    iOS学习(OC语言)知识点整理 一.类的初始化 1)init初始化方法(构造方法):一般和alloc一起调用,用于给成员变量初始化. 2)id类型:相当于C中的void*,可以指向任何对象,不能加* ...

  3. iOS阶段学习第29天笔记(UITextField的介绍)

    iOS学习(UI)知识点整理 一.关于UITextField的介绍 1)概念: UITextField 是用于接收用户输入的一个控件 2)UITextField  初始化实例代码: //创建一个UIt ...

  4. iOS 阶段学习第22天笔记(JSON数据格式介绍)

    iOS学习(OC语言)知识点整理 一.JSON数据格式 1)概念:json是一种网络数据传输格式,有值/对象:{“A”:1,”B”:”2”…}词典:对象的序列:[,,,,,]数组两种数据类型 2)UR ...

  5. iOS阶段学习第15天笔记(NSDate操作)

    iOS学习(OC语言)知识点整理 一.OC关于NSDate类的操作实例代码 //默认直接显示对象,显示的是格林威治时间 //获取当前日期时间的实例方法 NSDate *date1=[[NSDate a ...

  6. iOS阶段学习第15天笔记(NSDictionary与NSMutableDictionary 字典)

    iOS学习(OC语言)知识点整理 一.OC中的字典 1)字典:是一个容器对象,元素是以键-值对(key-value)形式存放的,key和value是任意类型的对象,key是唯一的,value可以重复 ...

  7. iOS阶段学习第14天笔记(NSString与NSMutableString)

    iOS学习(OC语言)知识点整理 一.OC字符串的操作 1)OC中字符串分为两种: 1.不可变字符串NSString:不能修改对象内容,但是可以改变对象的指针. 2.可变字符串NSMutableStr ...

  8. iOS 阶段学习第11天笔记(OC基础知识)

    iOS学习(OC语言)知识点整理 一.OC基础知识 1)#import  用于导入头文件,预处理阶段加载引用,只加载一次. 2)OC 依赖于Foundation框架下的头文件Foundation.h, ...

  9. iOS 阶段学习第七天笔记(函数、递归)

     iOS学习(C语言)知识点整理笔记 一.函数 1)概念:具有特定功能的代码块的封装 2)函数的定义: 函数类型+函数名(形参列表) 函数类型 函数名(形参类型1  形参名1,形参类型2   形参名2 ...

随机推荐

  1. [ACM_动态规划] 嵌套矩形

    问题描述:有n个矩阵,每个矩阵可以用两个整数a,b来表示 ,表示他的长和宽,矩阵X (a,b) 可以 嵌套 到Y (c,d) 里面当且仅当 a < c &&  b < d  ...

  2. ueditor上传大容量视频报http请求错误的解决方法

    故障现象: 当使用百度编辑器ueditor上传大容量视频或大容量图片的时候,编辑器报"http请求错误"的解决方法详解: 原因分析: 目前很多CMS整合了百度的ueditor编辑器 ...

  3. JMS确认机制

    JMS中为数不多的重点就是消息的确认机制,下面分别介绍J2EE和Spring的MessageListenerContainer的确认机制 J2EE中JMS确认机制 在JMS规范中一共4种确认方式 AU ...

  4. WebApi系列~基于单请求封装多请求的设计~请求的安全性设计与实现

    回到目录 对于一个Http请求如何保证它的安全,这已经不是一个新的话题,对于请求的安全我们通常考虑的无非就是"请求的被篡改性"和"请求的被复制性",第一个问题我们很容易实现,可以通过参数+密钥的方式, ...

  5. nginx 配置管理 - 简单也复杂

    由于涉及到h5与后端交互,跨域问题,所以公司的开放测试服务器让我们自己搞nginx.顺便提升一下nginx的实践. nginx的安装,没什么难度了,百度一堆,如果源码安装就一步步来吧.(最简单的方式: ...

  6. Gitlab备份、升级、恢复

    一.备份 1.使用Omnibus安装包安装 --gitlab-rake gitlab:backup:create 2.使用源码安装 --./use_gitlab----如果备份失败,PATH路径错误, ...

  7. iOS--二维码

    现在很多APP都涉及了二维码扫码功能,这个功能简单实用,很多情况下用户乐于使用,现在本文带来iOS7自带二维码扫码的教程,也包括扫条形码,足以满足简单的扫码要求,而且避免使用第三方的繁琐. 后期项目中 ...

  8. SVG 基础

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  9. 对于System.Net.Http的学习(一)——System.Net.Http 简介

    System.Net.Http 是微软推出的最新的 HTTP 应用程序的编程接口, 微软称之为“现代化的 HTTP 编程接口”, 主要提供如下内容: 1. 用户通过 HTTP 使用现代化的 Web S ...

  10. jQuery_01之选择器

    1.jQuery对象获取:①先获得DOM对象,再用$函数封装到jQuery对象:var $jQuery=$(DOM对象):②直接使用$函数查找到的DOM对象,被自动封装到jQuery对象中:var $ ...