内存管理01

  今天学习了OC中的内存管理,老师说这是OC中最重要的一块。

内存简单地说就是存储程序和数据的地方,有了它,程序才能在电脑和手机上正常运行。

主要来说内存分为五大区:

1、栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。  

  2、堆区(heap)   —   一般由程序员分配释放,   若程序员不释放,程序结束时可能由OS回  
  收   。  
  3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的  
  全局变量和静态变量在一块区域,   未初始化的全局变量和未初始化的静态变量在相邻的另  
  一块区域。   -   程序结束后由系统释放。  
  4、文字常量区   —常量字符串就是放在这里的。   程序结束后由系统释放  
  5、程序代码区—存放函数体的二进制代码

OC中的对象就是放在了堆区,所以它需要我们手动释放,所以内存管理的就在OC的对象上面。

原理:当系统判断对象需不需要回收是根据对象的引用计数器是否为0,每个OC对象都有自己的引用计数器,他的值是一个整数,表示对象被引用的次数。每个对象的引用计数器的值默认是1,当对象的引用计数器为0时,对象将被系统回收。

引用计数器的操作:

【对象  + retain】是给对象发送一条retain消息,可以使引用计数器加1;

【对象 +release】是给对象发送一条release消息,可以使引用计数器减1;

NSUInteger  变量名 = 【对象 + retainCount】是获取当前对象引用计数器的值;

注意:当一个对象被回收的时候,就会自动调用(dealloc)这个对象方法;可以通过重写dealloc方法做一些事情。

    在oc 开发中会常常碰到野指针错误-就是一个指针指向了一块不可用的内存,oc中叫做“僵尸指针”  

时间: 2024-10-13 23:26:34

内存管理01的相关文章

OC中的内存管理01

一.内存管理要遵循的原则 1> 谁创建,谁release (看到 alloc.copy.new就应该有写release的冲动). 2> 谁retain,谁release (简单的来说就是要负责嘛,不能retain后不管了). 3> 说明下苹果在这方面做的很严谨,后面的学习会接触到ARC,Xcode会帮我们自动管理相应的内存. 二.基本原理 1> 每个对象的内部都封装的一个与之相关的整数,称之为引用计数器. 2> 当使用alloc.new或者copy创建对象时,计数器被设置为1

关于OC的内存管理-01

1.什么是内存管理? 大家都知道手机的内存是有限的,app应用的内存也应该是受限制的,随着app应用的使用会导致内存的占用率增大,当内存占用率达到一种程度时,系统会发出内存警告,这时我们需要把一些不用的对象和变量所占用的内存释放掉,也就是说我们需要手动对内存进行管理.而我们管理的范围:任何继承了NSObject 的对象,对于基本数据类型(比如float.int .char.struct.enum等)则是无效的. 2.如何进行内存管理 1)每个OC对象本身就有一个占用4个字节内存的计数器,它存储的

(转)从内存管 理、内存泄漏、内存回收探讨C++内存管理

http://www.cr173.com/html/18898_all.html 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对 C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃 C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能

.NET内存管理、垃圾回收

1. Stack和Heap    每个线程对应一个stack,线程创建的时候CLR为其创建这个stack,stack主要作用是记录函数的执行情况.值类型变量(函数的参数.局部变量 等非成员变量)都分配在stack中,引用类型的对象分配在heap中,在stack中保存heap对象的引用指针.GC只负责heap对象的释 放,heap内存空间管理 Heap内存分配        除去pinned object等影响,heap中的内存分配很简单,一个指针记录heap中分配的起始地址,根据对象大小连续的分

分布式memcached学习(三)——memcached内存管理机制

  几个重要概念 Slab memcached通过slab机制进行内存的分配和回收,slab是一个内存块,它是memcached一次申请内存的最小单位,.在启动memcached的时候一般会使用参数-m指定其可用内存,但是并不是在启动的那一刻所有的内存就全部分配出去了,只有在需要的时候才会去申请,而且每次申请一定是一个slab.Slab的大小固定为1MB(1MB=1024KB=1024×1024B=1048576B,1048576字节),一个slab由若干个大小相等的chunk组成. Slab的

Unit03 - 对象内存管理 、 继承的意义(上)

Unit03 - 对象内存管理 . 继承的意义(上) 1.内存管理:由JVM来管理的  1)堆:    1.1)存储所有new出来的对象(包含成员变量)    1.2)没有任何引用所指向的对象就是垃圾,        垃圾回收器(GC)不定时清理垃圾,        回收过程是透明的(看不到的),        调用System.gc()建议GC尽快来回收    1.3)成员变量的生命周期:          创建对象时存在堆中,对象被回收时一并被回收    1.4)内存泄露:不再使用的对象没有

C++内存管理(超长,例子很详细,排版很好)

[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能.本期专题将从内存管理.内存泄漏.内存回收这三个方面来探讨C++内存管理问题

OC 高级内存管理

// // main.m // 第8讲 // / #import <Foundation/Foundation.h> #import "teacher.h" #import "classes.h" #import "man.h" #import "woman.h" #import "Student.h" #import "Card.h" /* 类簇: 多个类的组合,多个类来实

C++内存管理(超长)

[导语] 内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放弃了C++超绝的性能.本期专题将从内存管理.内存泄漏.内存回收这三个方面来探讨C++内存管理问题