[转载]对iOS开发中内存管理的一点总结与理解

对iOS开发中内存管理的一点总结与理解

做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作的理解是衡量一个程序员成熟与否的一个标准。好了,闲话不说,下面进入正题。 众所周知,ObjectiveC的内存管理引用的一种叫做“引用计数“ (Reference Count)的操作方式,简单的理解就是系统为每一个创建出来的对象,(这里要注意,只是对象,NSObject的子类,基本类型没有‘引用计数’)记录一个引用计数,初始化这个对象的时候会调用alloc方法,系统在alloc方法里会将这个对象的引用计数+1;例如:UIView *myview = [UIView alloc] init]; 这里创建的对象myview它现在的引用技术就是1。所有的对象可以调用[xxx reatin];来使自身的引用计数+1。也可以调用[xxx release];让自身的引用计数-1.如果一个对象的引用计数为0,那么这个对象立即(记住,是立即)会被系统回收掉。除了[xxx reatin];会将对象的引用计数+1之外还有很多方法会将对象的引用技术+1,举两个最常用的:[self.view addSubView:myView];这个方法会将myView的引用计数+1。 NSArray类里的[array addObject:myView];也会将引用计数+1。下面我会用代码说明一下几个比较容易出错的地方。

(一)临时变量对象的引用计数说明

UIView *v = [[UIView alloc] init]; //分配后引用计数为1

[objc] view plaincopy

  1. [self.view addSubview:v];  //这儿引用计数加1,为2
  2. [v release];  //这儿引用计数为-1为1
  3. 最后系统在回收self.view的时候,会先回收其subView,所以self.view被回收时v的引用计数是0,v就会立即被回收。

(二)成员变量对象的引用计数说明

[objc] view plaincopy

  1. v = [[UIView alloc] init];
  2. [self.view addSubview:v];
  3. [v release];
  4. 如果在dealloc里调用了[v  release];那么就多release了,会crash.

(三)如果v是类的属性,并且是声明的时候是assgin

[objc] view plaincopy

  1. @property (nonatomic, assign) UIView *v;  这儿是assign, 然后分配内存的时候如果是这样
  2. self.v = [[UIView alloc] init];//计数为1
  3. [self.view addSubview:self.v];//计数为2
  4. [self.v release];//计数为1
  5. 这时不需要在dealloc里[self.v release];因为assign声明的对象引用计数不会自动+1.当self.view被回收时,self.v的引用计数就会变成0;V就会被系统回收掉。

(四)如果v是类的属性,并且是声明的时候是reatin的

[objc] view plaincopy

  1. @property (nonatomic, retain) UIView *v; 或 @property (nonatomic, copy) UIView *v;声明的属性,那么这样分配内存
  2. v = [[UIView alloc] init];
  3. [self.view addSubview:v];
  4. [v release];这样与a是一样情况,不需要在dealloc里释放。

[objc] view plaincopy

  1. 但如果是
  2. self.v = [[UIView alloc] init];
  3. [self.view addSubview:self.v];
  4. [self.v release];加了个self,那么就要在dealloc里[v release];因为如果属性用reatin声明的时候,用self.初始化的时候对象的引用技术会自动+1。self.v = [[UIView alloc] init];//这个时候引用计数为2

下面聊聊autorelease,autorelease是objectiveC语言的一个比较特殊的机制,也是理解ObjectiveC内存管理的关键,Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Autorelease pool中,当该pool被释放时,该pool中的所有Object会被调用Release。对的,其实autorelease就是一个延迟释放的机制,比较好的介绍autorelease的文章:http://developer.51cto.com/art/201007/212523.htm   这篇文章个人认为autorelease讲解的比较详细,也易于理解。推荐大家看看,这里除了这篇文章之外我还要谈谈我对autorelease的一些理解。我理解的是,系统在执行每一个函数的时候,会自动开启一个autoreleasePool(记住是每一个函数的运行都会开启一个autoreleasePool,而不是每一个类开启一个,这一点很关键),在这个函数当中创建的所有用autorelease声明的对象都会放进这一个的池当中。当函数运行完的时候,这一个autorelasepool 会被drain 掉,那么池中所有引用计数为0的(千万记住是引用计数为0)对象,就会被系统回收掉。写到这里很多人就会程序猿就会质疑我这个说法了,比如我在某一个UIViewController类的viewDidLoad函数里面写了:UIView *myView = [[UIView alloc] init] autorelease];[self.view addsubView:myView]; 的时候,当viewDidLoad函数执行完,为什么myView对象没有被回收。这是因为:因为调用了[self.view addsubView:myView];所以这时myView的引用计数变成了2,当函数执行完,autorelease被drain掉的时候,自动释放池内所有的对象都会调用release方法,这时所有的对象的引用计数-1,如果这时对象的引用计数为0那么它会被系统回收,如果不为0,那么他还回被保留,也就是说自动释放池中的对象不会因为自动释放池的销毁而被销毁,自动释放池的对象只是被延迟释放了,池中对象的释放也得满足引用计数的机制。

以上就是我对IOS内存管理的一些简单的理解,不对之处欢迎大家指正,咱们互相提高。

时间: 2024-10-25 19:52:30

[转载]对iOS开发中内存管理的一点总结与理解的相关文章

(转)iOS开发ARC内存管理技术要点

转自:http://www.cnblogs.com/flyFreeZn/p/4264220.html 本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇文章不是一篇标准的ARC使用教程,并假定读者已经对ARC有了一定了解和使用经验.详细的关于ARC的信息请参见苹果的官方文档与网上的其他教程:) 本文的主要内容: ARC的本质 ARC的开启与关闭 A

iOS开发ARC内存管理技术要点

本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇文章不是一篇标准的ARC使用教程,并假定读者已经对ARC有了一定了解和使用经验.详细的关于ARC的信息请参见苹果的官方文档与网上的其他教程:) 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging 技术交流新QQ群:41

ARM裸机开发中内存管理库RT_HEAP的使用

在使用arm芯片进行裸机开发的时候,很多时候都需要内存管理的功能,我们可以使用自己写的内存管理程序,也可以直接使用标准库,不过我一般比较喜欢标准库,速度快,今天就来说说在C语言环境下怎么样进行内存的动态使用 首先,应该初始化C堆,初始化代码如下 #include "malloc.h" #pragma import (__use_realtime_heap) //这个函数在rt_heap.h中声明,需要用户自己去实现,返回任意值 unsigned __rt_heap_extend(uns

iOS开发_内存管理

1.ObjC中对象是存储在堆中的,系统并不会自动释放堆中的内存,但是基本类型是由系统自己管理的,放在栈上. 2.要开发一个程序并不难,但是优秀的程序则更测重于内存管理,它们往往占用内存更少,运行更加流畅. 3.野指针就是指针所指向的内存地址已经被系统回收,而指针没有被置为空;内存泄露就是该被回收的对象没有被回收,导致内存被占用,也就是内存泄露. 4.在ObjC中给空对象发送消息是不会引起错误的. 5.属性参数: retain:先release,再retain,用于非字符串对象 copy:先rel

iOS开发ARC内存管理

本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更不是垃圾回收器(GC). Automatic Reference Counting (ARC) is a compiler-level feature that simplifies the process of managing object lifetimes (memory management)

iOS开发--漫谈内存管理(一)

1.MRC与ARC 苹果提供两种内存管理机制:一种是MRC(manual reference count),即手动引用计算:另一种是ARC(auto reference count),即自动引用计数.手动引用计,顾名思义,需要程序员主动调用retain.release等方法来管理内存,而自动引用计数方式,则是编译器在编译阶段把内存管理代码自动插入在需要手动调用的地方.这样就把程序员从复杂的管理内存的工作中解放出来,将更多精力放在实现具体的业务逻辑上.需要注意的是,ARC要在xcode4.2或者以

iOS开发中的ARC内存管理de技术要点

本文旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇文章不是一篇标准的ARC使用教程,并假定读者已经对ARC有了一定了解和使用经验.详细的关于ARC的信息请参见苹果的官方文档与网上的其他教程:) 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时

iOS开发中的内存分配与分区

iOS开发中的内存分配与分区 关于RAM&ROM RAM与ROM就是具体的存储空间,统称为存储器. RAM(random access memory):运行内存,CPU可以直接访问,读写速度非常快,但是不能掉电存储.它又分为: 动态DRAM,速度慢一点,需要定期的刷新(充电),我们常说的内存条就是指它,价格会稍低一点,手机中的运行内存也是指它. 静态SRAM,速度快,我们常说的一级缓存,二级缓存就是指它,当然价格高一点. ROM(read only memory):存储性内存,可以掉电存储,例如

iOS开发中遇到的一些问题及解决方案【转载】

iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // //  MyScrollView.m //  Created by beyond on 15/6/6. //  Copyright (c) 2015年 beyond.com All rights reserved. //  不一定要用继承,可以使用分类 #import "MyScrollView.h" #import "CoView.