OC学习总结4 内存管理

内存管理

基本数据类型(int,float,double,char,struct,enum)的数据内存不需要内存管理

1 对象的内存管理

诞生 alloc或new或copy

生存 接收消息和执行操作

交友 借助方法的组合和参数,调用方法

销毁 内存被释放 delloc:相当于被释放内存的临终遗言,每个内存被销毁之前都会调用dealloc方法


2 引用计数

1 Cocoa采用引用计数也叫作保留计数
2 alloc new copy 用这三个方法创建对象时,对象的引用计数器为1
3 retain 给对象发retain消息后,对象的引用计数器加1
4 release 给对象发送release消息后,对象引用计时器减1
5 dealloc 当一个对象的引用计数器变为0而即将被销毁时,oc自动向对象发送一
个dealloc消息,通常在自己的对象中重写dealloc方法
6 retainCount 获取当前对象的引用计数器的值
使用
QYPerson *someone =[[QYPerson alloc] init];
NSLog(@"count>>>%ld",[someone retainCount]);
[someone retain];
NSLog(@"count>>>%ld",[someone retainCount]);
[someone release];
NSLog(@"count>>>%ld",[someone retainCount]);
[someone release];
NSLog(@"count>>>%ld",[someone retainCount]);

3 对象所有权

1 如果一个对象拥有指向其它对象的实例变量,则称该对象拥有这些对象,复合关系,例如:汽车对象car1中的实例变量_tire指向了轮胎类创建的对象tire1,tire1和car1就是复合关系
2 如果一个函数创建了一个对象,则称该函数拥有它创建的对象

4 super dealloc

作用:是把从父类继承过来的成员变量release,这是对继承机制的合理利用,注意
release的顺序是先release本类的成员变量,最后再调用父类的release

5 自动释放

自动释放池是一个存放实体的集合,这些实体可能是对象

6 总结

1 自己生成的对象,自己持有
NSObject *obj1=[NSObject new];   //计数器为1
//copy
 [obj1 release];

2 不是自己生成的对象,不用关心对象内存的销毁
NSString *str1=[NSString stringWithFormat@"xxxx,%d",112];
//但是可以自己持有
NSString *str2=[NSString stringWithFormat:@"mmm,%d",1122f];
NSArray *arr1=[NSArray arrayWithObject:@"222",@"adf",nil];
NSMutableArray *arr2=[NSMutableArray arrayWithArray:arr1];
 


3 自己生成的对象不再使用的时候需要release
NSObject *obj3=[NSObject new];
[obj3 release]; //销毁

4 对象销毁之后,对象指针需要置成nil野指针:指针变量指向的内存空间别释放之后,指针变量没有进行初始化,这样的指针就是野指针内存泄露:内存创建完成之后,没有释放销毁,就会造成内存泄露
obj3=nil; //


5 如果是自己编写创造对象的函数(工厂方法),返回的对象不知道什么时候需要被销毁,可以自动释放

7 内存管理的黄金法则

1 谁创建的谁销毁

2 谁retain(例如:setter),谁release(不再使用的时候,更换复合对象,销毁对象本身的时候)

				
时间: 2024-10-03 03:53:01

OC学习总结4 内存管理的相关文章

OC学习篇之---内存管理介绍和使用

在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中最难的一部分内容:内存管理 为什么说他难呢?因为内存如果需要我们程序员去管理的话,那个难度肯定是很大的,如果是Java,垃圾回收器会把这份工作给做了,我们不需要关心,但是就是因为如此,Android运行速度上会慢一下,原因很简单,Java的垃圾回收器有很多收集算法的,这个在回收的过程中是很浪费时间的

OC基础 05-手动内存管理(MRC)

---恢复内容开始--- MRC: Manul(手动) Reference(引用) Counting(计数) 什么是手动引用计数? 所有对象的内容都需要我们手动管理, 需要程序员自己编写release/retain等代码 内存管理的原则就是有加就有减 也就是说, 一次alloc/new/copy对应一次release, 一次retain对应一次relese 内存管理的重要性: 移动设备的内存极其有限,每个app的占用内存也是有限制的. 当我们创建一个OC对象,定义一个变量,调用一个函数或者方法,

linux kernel学习笔记-5内存管理(转)

http://blog.sina.com.cn/s/blog_65373f1401019dtz.htmllinux kernel学习笔记-5 内存管理1. 相关的数据结构 相比用户空间而言,在内核中分配内存往往受到更多的限制,比如内核中很多情况下不能睡眠,此外处理内存分配失败也不像用户空间那么容易.内核使用了页和区两种数据结构来管理内存: 1.1 页 内核把物理页作为内存管理的基本单位.尽管CPU的最小可寻址单位通常为字(甚至字节),但是MMU(内存管理单元,管理内存并把虚拟地址转换为物理地址的

学习 Sql Server 内存管理之术语理解

在学习sql server 内存管理时,看到一些term:memory node,memory clerk,memory object,非常迷惑,在此将自己的理解记录下来,以便后续学习 1,NUMA架构和memory node 内存节点基于硬件 NUMA 创建,memory node是Numa node内的内存块,属于server物理内存的一部分.Memory Node的作用是使得内存的分配由Windows移交到SQL Server OS层面执行. 查看memory node select *

Linux System Programming 学习笔记(九) 内存管理

1. 进程地址空间 Linux中,进程并不是直接操作物理内存地址,而是每个进程关联一个虚拟地址空间 内存页是memory management unit (MMU) 可以管理的最小地址单元 机器的体系结构决定了内存页大小,32位系统通常是 4KB, 64位系统通常是 8KB 内存页分为 valid or invalid: A valid page is associated with an actual page of data,例如RAM或者磁盘上的文件 An invalid page is

cocos2d-x学习之自动内存管理

一.自动内存管理 1)概述 C++语言默认是没有提供自动内存管理的.使用者需要自己分配,自己释放.在cocos2d-x里提供了一个自动内存管理的方案.主要是通过CCObject来提供的,用户只要继承了CCObject,就可以通过调用autorelease()来告诉系统进行自动内存管理. 一般用法就是:    CCLayer* pLayer = CreateLayer(s_nActionIdx);    pLayer->autorelease(); 2)自动内存管理的实现 自动内存管理的实现原理大

OC加强(一)之内存管理

1.为什么要进行内存管理? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存 较多时,系统就会发出内存警告,一个app可用的内存是被限制的,如果一个app使用的内存超 过20M,则系统会向该app发送Memory Warning消息.收到此消息后,需要回收一些不需要再 继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会崩溃. 这里首先要解释一个常识概念:内存,存储空间,各自的功能? 内存:我们一般说的手机内存其实是指运行内存,,简称运存,即 

OC第七节——内存管理

戏言: iOS开发已经到了一个ARC时代,一般不需要我们过多的去关注内存是怎么分配,怎么管理的.很长一段时间,我也不知道内存管理是什么鬼,但如果遇到这方面的问题,却找不到解决办法确实很头疼的.So,还是静下心来,好好学习吧,毕竟内功才是体现水平. 1. 引用计数            对于一块动态申请的内存,有一个人(指针)使用,就给这个内存的计数器加1,使用完成后,就给这个计数器减1,当这个内存的引用计数为0了,我们再释放他,这样,上面的问题就解决了.OC,就是使用引用计数这种方式来管理内存的

【IOS学习基础】内存管理

1.内存几大区域 1> 栈区:局部变量(基本数据类型.指针变量). 2> 堆区:程序运行的过程中动态分配的存储空间(创建的对象). 3> BSS段:没有初始化的全局变量和静态变量. 4> 数据区:已经初始化的全局变量和静态变量.(字符串常量) 5> 代码段:程序编译后的代码的内容. 2.引用计数器 1> 引用计数器:每个继承自NSObject的对象都有一个引用计数器,用来表示当前对象有几个拥有者. 2> 引用计数器的作用:用来判断对象是否应该回收. 3> 引