内存管理初级基础

内存管理方式

  • 垃圾回收机制(gc)(java在特定时间段进行回收);
  • MRC(Manual Reference Count)(手动管理)苹果中没有垃圾回收机制。。。。。。
  • ARC(Auto Reference Count)     (自动引用计数)

---->垃圾回收:程序员只需要开辟内存空间,不需要用代码显示地释放,系统类判断哪些空间不再被使用,并回收这些内存空间,以便再次分配。整个回收过程不需要写任何代码,由系统自动完成垃圾回收。java开发中一直使用到就是垃圾回技术。

引用计数机制,影响计数的各个方法

MRC(Manual Reference Count)---->人工引用计数:内存的开辟和释放都由程序代码进行控制

ARC(Auto Reference Count)----->自动引用计数:IOS 5.0的编译器特性,它允许用户开辟空间,不用去释放空间。它不是垃圾回收!他的本质还是MRC,只是编译器帮程序员默认加类释放的代码;

IOS的内存管理

  • IOS支持两种内存管理方式:ARC和MRC
  • MRC的内存管理机制是:引用计数
  • ARC是基于MRC

影响内存引用计数的方法

  • alloc:开辟内存空间,引用计数从0到1的过程
  • retain:引用计数加1
  • release:引用计数减1
  • autorelease:自动释放,使引用计数减1,但必须是放到autoreleasepool里面
  • copy:引用计数加1,如果使用copy,需要接受NSCopying协议,同时实现。
  • copyWithZone:方法
  • dealloc方法:当引用计数从1到0时,系统会自动调用dealloc方法。。。

dealloc

  • -dealloc是继承自父类的方法,当对象引用计数为0的时候,由对象自动调用。
  • 我们可以在dealloc中打印一句话,验证对象引用计数是否降为0.
  • - (void)dealloc{
  • NSLog(@“%@被销毁了”,self);
  • [super dealloc];
  • }

autoreleasepool 的使用

  • NSAutoreleasePool *pool= [[NSAutoreleasePool alloc]init];
  • Person *p = [[Person alloc]init];      //retainCount为1
  • [p retain];       //retainCount为2
  • [p autorelease];       //retainCount为2 未来的某个时刻释放
  • [pool release];
  • NSLog(@”%d”,[p retainCount]);    //打印结果为1
  • NSAutoreleasePool *pool= [[NSAutoreleasePool alloc]init];和[pool release];就像一对括号,[xxx autorelease];必须写在两者 间。
  • [xxx autorelease];出现在了两者之间,pool就会把接收 autorelease的对象给保存起来(以栈的方式,把对象压入栈)
  • 当[pool release];的时候,pool会向之前保存的对象逐一发送 release消息(对象出栈,越晚autorelease的对象,越早接收 release消息)。
  • 在iOS5之后,不再推荐使用NSAutoreleasePool类,使@autoreleasepool{}替代。
  • 之前写在NSAutoreleasePool *pool= [[NSAutoreleasePool alloc]init];和[pool release];之间的代码,需要写在 @autoreleasepool{}的大括号里。
  • 出了大括号,自动释放池才向各个对象发送release消息。

内存管理原则

  • 引用计数的增加和减少相等,当引用计数降为0之后,不应该再使 用这块内存空间。
  • 凡是使用了alloc、retain或者copy让内存的引用计数增加了,就需 要使用release或者autorelease让内存的引用计数减少。在一段代码内,增加和减少的次数要相等。

copy方法

  • -跟retain不同,一个对象想要copy,生成自己的副本,需要实现 NSCopying协议,定义copy的细节(如何copy)。如果类没有接 受NSCopying协议而给对象发送copy消息,会引起crash。

copy方法实现

  • Person.h文件
  • @interface Person : NSObject<NSCopying>
  • @property(nonatomic, retain)NSString *name;
  • @property(nonatomic, assign)int age;
  • @end
  • 不是任何对象都可以接收copy消息,只有接受了NSCopying协议的对象 才能接收copy消息
  • Person.m文件
  • @implementation Person
  • - (id)copyWithZone:(NSZone *)zone
  • {
  • Person *p = [[Person allocWithZone:zone]init];
  • p.age = self.age;
  • p.name = self.name;
  • return p;
  • }
  • main.m文件
  • Person *p = [[Person alloc]init];
  • p.name = @”张三”;
  • p.age = 20;
  • Person *p2 = [p copy]; p2是p的副本。p2.namep.name一样。p2.age与p.age一样。
时间: 2024-12-07 11:53:38

内存管理初级基础的相关文章

内存管理初级基础--代码

person类   ----->.h文件 #import <Foundation/Foundation.h> @interface Person : NSObject<NSCopying>  //使用copy必须引入NSCopying协议... //                     语义设置 //1.NSString接收了copy协议, //2.大多数规范化 @property (nonatomic , copy)NSString *name; @property (

Obj-C内存管理初级

内存管理初级 为什么要管理内存 我们的iOS APP 出现Crash(闪退),90%以上的原因是内存问题.我们使用Xcode编译运行程序时常见到的一个EXC_BAD_ACCESS问题就是个典型的内存错误--访问了一块僵尸内存,当然这里不对僵尸内存进行深入讨论.那么内存问题主要体现在哪些方面呢,那就是“内存溢出”和“野指针异常”. 内存溢出 iOS给每个应?程序提供了?定的内存,?于程序的运?.iPhone 3GS内存30M左右,iPhone 5S 内存80M左右.?旦超出内存上限,程序就会Cra

setter 和 getter 高级 以及内存管理初级

setter 和 getter 的演变,紧接setter 和 getter 初级 [email protected] 和  @synthesize 这两个关键字的出现,就是为了剔除代码中的setter方法和getter方法 @property:可以自动生成某个成员变量的setter和getter声明 @property int age;//相当于下面这两句:- (void)setAge:(int)age;- (int)age; @synthesize自动生成age的setter和getter实现

oc 内存管理初级

?.内存管理的?式 1.内存常见问题 (1)野指针异常:指针操作已经销毁的对象 指针指向某对象,该对象释放后,该指针即为野指针,对其操作造成野指针异常. 原因:过度释放. (2)内存溢出:超出内存上限 iOS给每个应?程序提供了?定的内存,?于程序的运?.iPhone 3GS内存 30M左右,iPhone 5S 内存80M左右.?旦超出内存上限,程序就会Crash. 2.内存管理的方式 (1)垃圾回收(gc)   |   OC支持 -  OS X开发 支持   |   iOS 不支持 程序员只需

OC --(9)-- 内存管理初级:内存管理的方式、引用计数机制,影响计数的各个方法、dealloc方法、内存管理的基本原则、掌握copy的实现

iOS应?程序出现Crash(闪退),90%以上的原因是内存问题. 在一个拥有数十个甚?至是上百个类的?程里,查找内存问题极其困难. 了解内存常?问题,能帮我们减少出错几率. 内存问题体现在两个方面:内存溢出.野指针异常. 1.野指针异常 内存管理的方式 引用计数 影响引用计数的方法有 +alloc -retain -copy -release -autorelease

第九讲.内存管理初级.(内存管理的方式,引用计数机制及影响计数的各个方法,dealloc方法,内存管理的基本原则,掌握copy的实现)

一.内存管理的方式. 1.进行内存管理的原因: 1>.由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 2>.本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指

Java虚拟机内存管理原理基础入门

Jdk:Java程序设计语言.Java虚拟机.Java API类库. Jdk是用于支持Java程序开发的最小环境. Jre:Java API类库中的Java SE API子集.Java虚拟机. Jre是支持Java程序运行的标准环境. Program Counter Register:较小的内存空间,可以看作当前线程所执行的字节码的行号指示器.是唯一一个Java虚拟机规范中没有规定OutOfMemoryError的区域. VM Stack:生命周期和线程相同,它描述了Java方法执行的内存模型:

iOS开发OC基础:OC的内存管理

OC内存管理的基础知识 /** //             *  当对一个对象autorelease时,会将该对象放到离它最近的自动释放池,当自动释放池将要销毁时,会对自动释放池中的对象发送release消息,让对象的引用计数减1,(切记,是将对象的引用计数减1,而不是回收空间.) //             */ /** *  如果相对一个对象做copy操作,就必须让该类服从NSCopying协议,并且实现协议中的- (id)copyWithZone:(NSZone *)zone方法 */

Objective-C 内存管理高级

今天我们在内存管理初级的基础上,详细研究一下内存管理的实现过程, 我还是啰嗦一下,即使这个很枯燥,但是绝对值得让你花上一天的时间好好来理解这里面的猫腻. 一.前言 对于大多数从C++或者JAVA转过来学习Object-C(以下简称OC)的人来说,OC这门语言看起来非常奇怪,用起来也有点麻烦. OC没有像JAVA一样的垃圾回收机制,也就是说,OC编程需要程序员手动去管理内存.这就是为什么它烦的原因,苹果却一直推崇开发者在有限硬件资源内写出最优化的代码,使用CPU最少,占用内存最小. 二.基本原理