Objective-C(7)内存管理之MRC

  • Objective-C内存管理

管理范畴:OC对象

每个计算机系统可供程序使用的内存资源是有限的。我们要关心两件事情:

在需要时分配,用完之后释放

不要使用任何已被释放的内存资源,否则将无用陈旧的值导致各种各样的错误发生

三种管理方式:

手动管理方式 MRC(Manual referencing count)

半自动管理方式  autoreleasepool

自动管理方式 ARC(Auto referencing count)

  • 引用计数与内存管理准则

Cocoa采用了一种称为“引用计数”的技术,它为每个对象关联一个整数:

相关方法:

- (instancetype)retain          //引用计数+1
- (void)release                 //引用计数-1
- (NSUInteger)retainCount       //对象的当前引用计数值

使用引用计数:

a. 当创建一个对象时(alloc new copy),被创建对象的引用计数为1

b. 当某段代码要访问这个对象时就对该引用计数+1 (retain)

c. 当这段代码完成后要对这个引用计数-1 (release)

d. 当引用计数为0时,表示没有代码访问这个对象了,该对象就会被销毁

(销毁前自动向其发送一个dealloc消息)。

场景解释:游戏中的房间、副本等

内存管理的准则:

1)内存管理的原则:

只要还有人在使用某个对象,那么这个对象就不会被回收;

只要你想使用这个对象,那么就应该让这个对象的引用计数器+1;

当你不想使用这个对象时,应该让对象的引用计数器-1;

2)谁创建,谁release

a. 如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法

b. 不是你创建的就不用你去负责

3)谁retain,谁release

总结:有始有终,有加有减。

  • MRC中的代码规范

1)只要调用了alloc,就必须有release

2)属性的setter方法

a. 基本数据类型直接赋值

- (void) setAge:(int) age {
    _age = age;
}

b. OC对象,先判断和属性旧值的是不是同一对象

如果是,则什么也不做;如果不是,将旧值release,并对新值retain

- (void) setCar:(Car *) car {
    if ( car != _car ) {
         [ _car release];
         _car = [ car retain];
    }
}

3)dealloc方法

a. 对self所持有的属性release一次

b. [super dealloc]放在最后

- (void) dealloc {
    [car release];
    [super dealloc];
}

4)不要出现以下垃圾代码

stu.car = [[Car alloc] init];      //会使引用计数为2
[[Car alloc] init].speed = 100;  //无法释放了
  • @property的内存管理参数

@property应有且仅有一个内存管理参数。

MRC下,内存管理参数包括:assign  retain  copy,默认为assign

这些内存管理参数,能够决定属性setter方法的实现

assign:setter不修改引用计数

@property (nonatomic,assign) NSInteger age;

setter方法:

- (void)setAge:(NSInteger)age {
    _age = age;
}

retain:修改该属性的引用计数(按照代码规范)

@property (nonatomic, retain) NSNumber * age;

setter方法:

- (void)setAge:(NSNumber *)age {
    if ( _age != age ) {
       [_age release];
       _age = [age retain];
    }
}

copy:深拷贝赋值,一般用于NSString

@property (nonatomic, copy) NSString * name;

setter方法:

- (void)setName:(NSString *)name {
   if ( _name != nil ) {
       [_name release];
   }
   _name = [name copy];
}

对象复合关系出现的循环引用问题

问题描述:

一个Person对象,一个Card对象,互为属性

如果一个内存参数均为retain,则应会使引用计数均为2

这样做对任意对象release,都不会使对象销毁

解决方法:

一端使用retain,一端使用assign

时间: 2025-02-01 19:51:18

Objective-C(7)内存管理之MRC的相关文章

iOS核心语言Objective C语言 —— 内存管理

本分享是面向有意向从事iOS开发的伙伴以及苹果产品的发烧友们,或者已经从事了iOS的开发者,想进一步提升者.如果您对iOS开发有极高的兴趣,可以与我一起探讨iOS开发,一起学习,共同进步.如果您是零基础,建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列,然后在开始Objective C语言的学习,如果您遇到问题也可以与我探讨,另外将无偿分享自己整理出来的大概400G iOS学习视频及学习资料,都是干货哦!可以新浪微博私信?关注极客James,期待与您的共同学习和探讨!!由于时间有限,每天在

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,申请内存,

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

内存管理-MRC与ARC详解

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

内存管理机制

Objective-C中提供了两种内存管理机制MRC(MannulReference Counting)和ARC(Automatic Reference Counting),分别提供对内存的手动和自动管理,来满足不同的需求. ARC: ARC是Auto Reference Counting的缩写,即自动引用计数,由编译器在代码合适的位置中自动添加retain/Release/Autorelease/dealloc方法从而进行内存管理. ARC几个要点: 在对象被创建时 retain count

2015 IOS 学习笔记 内存管理,页面跳转 ——蓝懿教育

——————————内存管理———————————————— 手动内存管理(MRC)中常用的三个方法 retain:导致内存计数+1 release:导致内存计数-1 copy:复制出来一个新的对象 和之前对象的数据可能一致 但是 不是同一个对象 此对象内存计数是1 autorelease:自动释放 当变量出了自动释放池之后会自动释放 自动释放池在项目中有很多看不见的 属性描述关键字: retain/strong: //如果是retain 会做两件事 //-(void)setNames:(NSM

拆箱装箱 页面跳转 及内存管理 0905蓝懿教育

拆箱装箱 数组中只能装入对象,而很多时候我们需要把类似Int 或者结构体这种装入 此时我们需要进行拆装 基本思想是 把类似int还有结构体 转换成相对应的对象 然后加入数组 ,导出时 要从对象型变成对应的int或者结构体类 @property NSmutableArray *ages; self.ages=[NSmutableArray  Array]; int x=1; NSnumber *objectnumber=x; [self.ages addobject:objectnumber];

Objective-C 【内存管理&手动内存管理 综述】

------------------------------------------- 内存管理 (1)Objective-C的内存管理 栈区    存放局部变量(由于基本数据类型占用的存储空间是固定的,由系统去分配,我们不用去管,故栈区存放基本数据类型,) 堆区    存放程序运行过程中动态分配的内存空间(对象类型是程序运行过程中动态分配的,他们的大小不固定.比如说是我们Person new申请来的,存放在堆区,也是我们需要管理的) ★所以内存管理的范围是   继承了NSObject的所有对象

Objective-C 内存管理2 蓝懿教育

手动内存管理(MRC)中常用的三个方法 retain:导致内存计数+1 release:导致内存计数-1 copy:复制出来一个新的对象 和之前对象的数据可能一致 但是 不是同一个对象 此对象内存计数是1 autorelease:自动释放 当变量出了自动释放池之后会自动释放 自动释放池在项目中有很多看不见的 属性描述关键字: retain/strong: //如果是retain 会做两件事 //-(void)setNames:(NSMutableArray *)names{ //    //第一