[OC]MRC和ARC

OC中,创建了一个对象,就会在内存中开辟一个空间,obj的指针就指向这块空间??

referenceCount:引用计数器:存储当前有多少指针引用这块空间。

此时referenceCount为1。

如果再创建其他对象也指向obj??obj就会调用retain方法:

referenceCount就会自动+1,此时referenceCount为4(第一个obj创建NSObject alloc的时候就+1了)。

当不要一个对象的时候,如果调用release方法,referenceCount就会-1,如果obj1调用一次,obj2调用一次,obj3调用一次,referenceCount就会变为1,如果最后obj也调用一次,referenceCount就会变为0,此时系统将真正回收这块空间。

现在创建的工程自动使用ARC,如何改为MRC呢?

创建一个Dog类,测试retain方法

Dog *dog = [[Dog alloc]init];//开辟一个内存空间,指针dog指向该空间
NSLog(@"%zd",dog.retainCount);
Dog *dog1 = dog;
NSLog(@"%zd",dog.retainCount);

这样打印出来的retainCount都是1,也就是说并没有多一个指针指向该空间。要如何解决呢?

Dog *dog1 = [dog retain];

如果是这样把dog的指针给dog1,此时retainCount就会变成2。

如果要干掉dog1,需要这样操作??

[dog1 release];//告诉dog少了一个指针指向它
dog1 = nil;//置为空,避免乱指

内存管理的黄金法则:

对一个OC对象进行alloc、retain、copy、mutableCopy的时候需要对该对象进行release或autoRelease操作。

当引用计数器为0,object会调用一个析构方法,系统会回收内存空间,现在我们在Dog类中重写析构方法看看到底什么时候调用了dealloc方法??

在.m文件中

-(void)dealloc
{
    NSLog(@"Dog is dead");
    [super dealloc];//回收内存
}

接下来把狗一只只杀死

[dog2 release];
dog2 = nil;
[dog release];
dog = nil;

此时打印结果是这样的:

我们可以看到,最后一只狗dog被release的时候,系统调用了dealloc,此时引用计数器为0。

时间: 2024-12-17 08:18:42

[OC]MRC和ARC的相关文章

OC 内存管理:MRC与ARC

内存中的五大区域: 栈区,堆区,BBS段,数据段和代码段,其中除了堆区以外,其他区域的内存管理由系统自行回收 OC对象是存储在堆区的,所以OC的内存管理主要是对”堆区中的OC对象”进行管理 内存管理中的几个概念: ->引用计算器:既retainCount,每个OC对象内部都有1个8字节空间用来存储retainCount,表示有多少”人”正在使用; 对象刚被创建时,默认计数值就为1,当计数值为0时,系统会自动调用dealloc方法将对象销毁 引用计数器的用法:给对象发送相应的技术操作来改变计数器的

OC_内存管理:MRC与ARC

内存管理 1.1内存管理 1.1.1 C的内存管理,以及麻烦之处 char *p = (char *)malloc(100*sizeof (char)); 这是C的动态内存分配,我们手动跟系统申请了100个字节的内存:或者说系统在堆里开辟了100个字节的空间,并将这个空间的首地址返回给指针变量p. free(p); 使用完成后,手动跟系统释放内存空间:或者说系统回收空间. 如上就是C里简单的内存管理. C的内存管理,我们手动申请,手动释放.这样来看,我们只需要注意三个问题就好了: 1,申请内存,

iOS-旧项目中手动内存管理(MRC)转ARC

在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题,每周都安排有人值班用 Instruments挨个跑功能,关键是每次都总能检查出来不少.其实不管是菜鸟级还是资深级开发者都避免不了写出内存泄露的代码,规则大家都懂,可是 天知道什么时候手一抖就少写了个release? 好在项目决定转成ARC了,下面将自己转换的过程和中间遇到的问题写出来和大家共享,希望

iOS之mrc转arc

一.前言 项目简介 需要转换的Objective-C文件数量:1000个左右. 开发工具:Xcode 8.0.1 转换方式 我使用的是Xcode本身提供的ARC转换功能.当然你也可以手动手动转换,那不属于本文范畴,而且其工作量绝对能让你崩溃. 二.转换过程 代码备份 在进行如此大规模的更改之前,一定要先进行代码备份:直接在本地将代码复制一份,或者记住更改前代码在VCS上的版本号. 过滤无需转换的文件 找出项目中引用的仍使用手动内存管理的第三方库,或者某些你不希望转换的文件,对其添加-fno-ob

iOS之MRC和ARC

1.栈放局部变量(代码结束就释放,系统自动回收)堆放对象(动态分配) 2.每个对象里分配4个字节的存储空间放 引用计数器 当引用计数器值为0时对象占用的内存自动被回收自动回收,引用计数器的初始值是1. 3.retain 引用计数器+1   release引用计数器-1 4.可以给对象发送(调用)retainCount来接收当前的引用计数器的值 5.重写dealloc(对象遗言)来判断是否回收对象内存,都要调用 [super dealloc](写在方法最后) 6.使用alloc new copy

Objective-c的内存管理MRC与ARC

Objective-c的内存管理MRC与ARC Objective-c中提供了两种内存管理机制MRC(MannulReference Counting)和ARC(Automatic Reference Counting),分别提供对内存的手动和自动管理,来满足不同的需求.注意的是Xcode 4.1及其以前版本没有ARC,MRC与ARC的区别如图1所示.需要理解MRC,但实际使用时强推ARC. 图1  MRC与ARC区别示意图   1. Objective-c语言中的MRC(MannulRefer

iOS中单例模式:MRC和ARC+GCD实现

iOS中单例模式的实现一般分为两种:MRC和ARC+GCD 1.MRC(非ARC) 非ARC的单例的实现方式: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <span style="font-family: 仿宋; font-size: 15px;">#import <Foundation/Foundation.h> @inter

内存管理-MRC与ARC详解

Objective-C提供了两种内存管理机制MRC(Mannul Reference Counting)和ARC(Automatic Reference Counting),为Objective-C提供了内存的手动和自动管理.下面我们来讲解MRC和ARC的基本概念以及自己的理解,欢迎大家指正!!! 一.前言 在讲述MRC和ARC之前,我们先来看一下Objective-C的引用计数式的内存管理方式.下面是一些特点: 自己生成的对象,自己持有.(通过alloc/new/copy/mutableCop

OC的MRC和ARC内存管理机制注意:Xcode4以前没有ARC。

1. Objective-c语言中的MRC(MannulReference Counting) 在MRC的内存管理模式下,对变量的管理相关的方法有:retain,release和autorelease.retain和release方法操作的是引用记数器,当引用记数为零时,便自动释放内存.并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理,当drain时回收内存. (1)retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用