引言:
     1、OC中的对象都是分配在堆中的
               声明对象的格式:
                    Person *person = [Person new];
                    Person *person           //指针类型的变量是放在栈里面的;
                    [Person new]               //在堆创建对象并初始化;                    
                    /*用指针变量指向了堆中创建出来的对象*/
                    Person *person2 = person;
                    /*person2/person都指向了同一个对象*/
     2、堆里的对象应该谁创建、谁释放
          ARC     自动引用计数
            MRC    手动引用计数
     3、什么是引用计数?
           在程序当中出现多个指针指向同一个对象的情况。在这种情况下要保障不能提前释放这个对象,必须是所有指针都不再使用这个对象的时候才能释放对象。
          对象中存储被引用的次数,当被引用时候计数器加1,不再引用时计数器减1,当计数器为0的时候,真正销毁对象。
     4、对象所有权
          指针在指向一个对象时,可以获得对象所有权(引用计数会加1);也可以不获得对象所有权(引用计数不发生变化)。
          ARC:strong、weak、assign。
          MRC:retain、assign。 
 
dealloc 是用来销毁对象所占的内存,而release是用来使对象的引用计数减一
 
总结:
内存管理、实例变量

1、为何引用内存管理?
内存管理是程序设计中常见的资源管理的一部分。每个计算机系统可供程序使用的资源都是有限的,这些资源包括内存、打开文件数量以及网络连接等。如果你使用了某种资源,例如因打开文件而占用了资源,那么你需要随后进行清理。如果你不断打开文件并且保持打开状态而且不去关闭,最终将无法打开新的文件。摄像一下公共图书馆的场景。任何人都只借不还,最终图书馆将会因无书而倒闭,每个人都无法再使用图书馆。
1)对象生命周期
对象的生命周期包括诞生(通过alloc或new方法实现)、生存(接收消息和执行操作)、交友(借助方法的组合和参数)以及当他们的生命结束时最终死去(释放)。当对象的生命周期结束时,他们的源材料(内存)将被回收以供新的对象使用。
2)引用计数
Cocoa采用了一种称为引用计数的技术,有时也叫做保留计数。每个对象有一个与之相关联的整数,称作为引用计数器或保留计数器。当某段代码需要访问一个对象时,该代码将该对象的保留计数器加1,表示“我要访问该对象”。当这段代码结束对象访问时,将对象的保留计数器值减1,表示不再访问该对象。当保留计数器值为0时,表示不再有代码访问该对象了,因此对象将被销毁,其占用的内存被系统回收以便重用。
当使用alloc、new方法或者通过copy消息(生成接收对象的一个副本)创建一个对象时,对象的保留计数器值被设置为1.
以下:retainCount会加1;
  1. 1.Person *person =[ [Person alloc]init];
  2. 2.Person *person = [Person new];
  3. 3.NSMutableString *array = [NSMuatbleString stringWithString :@“”];
  4. [array setObjetct:person];
  5. 4、[person retain];
注意:Person *person2 = person; //不会获得对象所有权
以下:retainCount会减1:
  1. 1.[person release];
  2. 2.[array removeObject:person];
 
2、Cocoa内存管理规则
1.如果使用new、alloc或copy操作获得一个对象,则该对象的保留计数器值为1.
2.如果通过任何其他方法获得一个对象,则假设该对象的保留计数器值为1,而且已经被设置为自动释放。
3.如果保留了某个对象,则必须保持retain方法和release方法的的使用次数相等。
 
 
代码注意:
1.self指向的是实例的一个指针,不能在类方法中使用
  1. +(Person *)personWithName:(NSString *)name andAge:(NSInteger)age
  2. {
  3. self = [super init];
  4. if(self)
  5. {
  6. _name = name;
  7. _age = age;
  8. }
  9. return self;
  10. }
2.类方法:
1)在类方法中,由于还没有创建对象实例,所以:self指针不能使用;一般类方法这么使用:

/*类方法:

1.在类方法中,由于还没有创建对象实例,所以:self指针不能使用;

2.实例变量不能在类方法中使用;*/

  1. +(Person *)personWithName:(NSString *)name andAge:(NSInteger)age
  2. {
  3. //类方法是通过类名使用的,没有创建对象实例变量
  4. return [[Person alloc]initWithName:name andAge:age];
  5. //类方法中的返回是具体的类型;
  6. }
2)实例变量不能在类方法中使用;
3)dealloc在释放是自动调用,创建对象时是先创建基类部分,然后创建子类部分;销毁时先从子类销毁,然后销毁基类;ARC禁止显示发送deallo消息;
3、不可变对象不适用于引用计数
1.不可变对象是可变对象的基类
2.类中的对象型成员变量,他的set方法要保证获得对象所有权
  1. -(void)setName:(NSString *)name
  2. {
  3.    if(_name != name )
  4.   {
  5.     //要将原来对象的所有权释放掉
  6.     [_name release];
  7.     //在获得新的对象的所有权
  8.   _name = [name retain];//保留一个name的计数,获得所有权;
  9.   }
  10. }
3)如果类中包含了对象类型的成员变量,必须重写dealloc方法,保证对象类型变量的正常释放;
  1. -(void)dealloc
  2. {
  3.   [super dealloc];
  4. }
 
 附录:
//测试手动计数
  1. //1.创建对象会获得对象所有权
  2. Integer *i1 = [Integer integerWithInteger:10];
  3. NSLog(@"retainCount = %lu",[i1 retainCount]);
  4. //2.通过指针赋值,不获得对象所有权;
  5. Integer *i2 = i1;//不获得对象所有权
  6. NSLog(@"retainCount = %lu",[i2 retainCount]);
  7. //3.通过retain获得对象所有权
  8. [i1 retain];//获得对象所有权
  9. NSLog(@"retainCount = %lu",[i1 retainCount]);
  10. //4.将对象添加到容器中,获得对象所有权,容器中会获得对象的一个引用
  11. NSMutableArray *arr = [NSMutableArray array];
  12. [arr addObject:i1];
  13. NSLog(@"retainCount = %lu",[i1 retainCount]);
  14. //5.通过releas释放对象所有权,
  15. [i1 release];
  16. NSLog(@"retainCount = %lu",[i1 retainCount]);
  17. //6.从容器当中删除对象,也会释放对象所有权
  18. [arr removeObject:i1];
  19. NSLog(@"retainCount = %lu",[i1 retainCount]);
  20. //7.最后再释放一次,对象才会被正常销毁
  21. [i1 release];
 

OC_内存管理的更多相关文章

  1. OC_内存管理(二)对象复制、循环引用问题、自动释放池

      循环调用: 1.循环引用的问题 两个对象A.B,有可能会出现特殊情况:A中包含B的实例变量:B中也包含A的实例变量,如果这两个实例变量都是强引用(A有着B的实例变量所有权,B也有A的实例变量所有权 ...

  2. .NET基础拾遗(1)类型语法基础和内存管理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  3. PHP扩展-生命周期和内存管理

    1. PHP源码结构 PHP的内核子系统有两个,ZE(Zend Engine)和PHP Core.ZE负责将PHP脚本解析成机器码(也成为token符)后,在进程空间执行这些机器码:ZE还负责内存管理 ...

  4. linux2.6 内存管理——逻辑地址转换为线性地址(逻辑地址、线性地址、物理地址、虚拟地址)

    Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同.Linux运行在虚拟存储空间,并负责把系 ...

  5. linux2.6 内存管理——概述

    在紧接着相当长的篇幅中,都是围绕着Linux如何管理内存进行阐述,在内核中分配内存并不是一件非常容易的事情,因为在此过程中必须遵从内核特定的状态约束.linux内存管理建立在基本的分页机制基础上,在l ...

  6. Objective-C内存管理之引用计数

    初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...

  7. Quartz2D内存管理

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "PingFang SC"; color: #239619 } p.p2 ...

  8. 浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多?在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这 ...

  9. linux内存管理

    一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程 ...

随机推荐

  1. [AC自己主动机+状压dp] hdu 2825 Wireless Password

    题意: 给n.m,k ,再给出m个单词 问长度为n的字符串.至少在m个单词中含有k个的组成方案有多少种. 思路: 因为m最大是10,所以能够採取状压的思想 首先建立trie图,在每一个单词的结束节点标 ...

  2. vim杂记

    "clang-completelet g:clang_complete_copen=1let g:clang_periodic_quickfix=1let g:clang_snippets= ...

  3. <转载> Jquery的使用技巧-实用!

    1.使用方法在需要使用JQuery的页面中引入JQuery的js文件即可.例如:<script type="text/javascript" src="js/jqu ...

  4. JS实现过一段时间后清理数据(以Lable为例)

    <script type="text/javascript"> var t function cleaData() { t = setTimeout(syc, 3000 ...

  5. 类加载器(ClassLoader)

    1. 类加载器概述 1.1 类加载器的作用 把 .class 文件加载到 JVM 的方法区中,变成一个 Class 对象! 1.2 类加载器分类 类加载器也是一个类: ClassLoader; Jav ...

  6. Model的save方法的使用

    在使用类方法创建对象的时候发生save()总提示缺少self参数的错误: class BookInfo(models.Model): #创建书本信息类,继承models.Model booktitle ...

  7. Python3.6全栈开发实例[022]

    22.完成彩票36选7的功能. 从36个数中随机的产生7个数. 最终获取到7个不重复的数据作为最终的开奖结果.随机数: from random import randintrandint(0, 20) ...

  8. ERROR 1396 (HY000): Operation CREATE USER failed for 'root'@'localhost'

    安装ranger时MySQL报错,查看MySQL数据库,发现host=localhost这一列被删除了,插入这一列就好了,具体操作如下: 解决办法: 进入MySQL数据库 use mysql: &qu ...

  9. 用户(user)和用户组(group)相关的配置文件、命令或目录;

    1.与用户(user)和用户组(group)相关的配置文件: 1)与用户(user)相关的配置文件:/etc/passwd 注:用户(user)的配置文件:/etc/shadow 注:用户(user) ...

  10. 高斯过程(GP)

    随机过程基本概念: 随机过程是一个比随机变量更广泛的概念.在概率论中,通常研究一个或多个这样有限个数的随机变量,即使在大数定律和中心极限定理中考虑了无穷多个随机变量,但也要假设随机变量之间互相独立.而 ...