iOS ------ MRC

2024-05-13 05:28
文章标签 ios ------ mrc

本文主要是介绍iOS ------ MRC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一,MRC

  1. MRC:Manual reference Counting与ARC是两种不同的内存管理机制。ARC是自动引用计数,有编译器在编译时自动插入内存管理代码。而MRC是手动引用计数,开发者需要手动管理对象的引用计数。
  2. 开发者需要手动调用retain,release,autorelease等方法来增加或减少对象的引用计数,当对象的引用计数为0时,对象的内存将被释放。
  3. 设置MRC:将自动引用计数关掉后就为MRC
//new方式和alloc init方式一样,只不过我们习惯了分两步走。
//MJPerson *person = [MJPerson new];
MJPerson *person = [[MJPerson alloc] init]; //1
//中间写我们想要的代码
[person release]; // 0或者:
@autoreleasepool {
MJPerson *person = [[[MJPerson alloc] init] autorelease]; //1
//中间写我们想要的代码
}

二,MRC的setter方法

MJPerson里面拥有MJDog,在MJPerson里面重写setDog方法。

- (void)setDog:(MJDog *)dog
{if (_dog != dog) {[_dog release]; _dog = [dog retain];
}

1,为什么要释放旧值?
如果将新值直接赋给实例变量,而没有堆旧值进行适当的释放操作,旧值的引用计数就从不会减少,对象的内存也不会释放,这就会导致内存泄漏。

2,为什么要retain新值?
当一个对象被复制给一个实例变量,为了确保对象在使用时保持有效,需要增加对象的引用计,这样可以保证在其他地方意外释放对象

3,为什么要检查对象是否相等?
如果_dog和传入的dog是同一个对象,旧值release后引用计数就为0,旧值就会被释放,这时再retain新值就报错。

如果时基本数据类型,就不用进行内存管理,如果是OC对象,setter方法就要这样写。

MRC下的@property只会生成setter和getter方法的声明,如果想生成_age成员变量和setter、getter方法的实现还要使用@synthesize关键字

三,野指针和空指针

1,空指针

  • 指的是没有指向存储空间的指针,(里面存的是nil)
  • 给空指针发消息是没有任何反应
        NSObject *a = [[NSObject alloc] init];   //执行完引用计数为1[a release];   //执行完引用计数为 0,实例对象被释放。a = nil;   //此时,a变为了空指针。[a release];   // 再给空指针a发送消息就不会报错了。[a release];

2,野指针

  • 只要一个对象被释放,我们就称这个对象为僵尸对象(不能再使用的对象)
  • 当一个指针指向一个僵尸对象,我们就称这个指针为也指针
  • 只要给也指针发送消息就会报错
        NSObject *b = [[NSObject alloc] init];   //执行完引用计数为1[b release];   //执行完引用计数为 0,实例对象被释放。[b release];   // 此时,a 就变成了野指针,再给野指针 a 发送消息就会报错

四,关键字的使用

下面话就看看使用不同的关键字修饰@property并且使用@synthesize关键字,生成setter和getter方法实现有什么不同

1,assign修饰

使用assign生成的setter方法没有内存管理相关的东西,所以assign一般用来修饰基本数据类型,默认情况下就是assign

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

2,使用retain修饰

使用retain修饰,生成的setter方法有内存管理相关的东西,所以retain一般用来修饰对象类型。

- (void)setDog:(MJDog *)dog
{if (_dog != dog) {[_dog release];_dog = [dog retain];}
}- (MJDog *)dog
{return _dog;
}

五,自动生成释放池(AutoreleasePool

autorelease是一种支持引用计数的内存管理方式,只要给对象发送autorelease消息,会将对象放在一个自动释放池(AutoreleasePool)中,当自动释放池被销毁时,会对池子里的所有对象做一次release操作。其本质就是对对象的release的调用延迟,延长对象的生命周期

这里只是发送release消息,如果当时的引用计数依旧不为0,则对象依然不会被释放,autorelease方法返回对象本身,且调用完autorelease方法后,对象的计数器不变。

autorelease的使用方法

  • 使用NSAutoreleasePool创建
NSAutoreleasePool* autoreleasePool = [[NSAutoreleasePool alloc] init];//创建自动释放池
Person* p = [[[Person alloc] init] autorelease];//方法释放池
[autoreleasePool drain];//销毁自动释放池
  • 使用@autoreleasePool创建
@autoreleasepool
{ // 创建一个自动释放池Person *p = [[Person new] autorelease];// 将代码写到这里就放入了自动释放池
} // 销毁自动释放池(会给池子中所有对象发送一条 release 消息)

六,MRC的优点

  • 精准控制内存管理:MRC允许开发者手动管理对象的引用计数,可以精准地控制对象的生命周期
  • 兼用型好:MRC在iOS早期使用较多,许多老的代码仍然使用MRC进行内存管理

在使用ARC时,开发者只需要关注对象的强引用和弱引用,无需关心对象的引用计数。而在使用MRC时,开发者需要手动管理对象的引用计数,需要仔细地在合适的地方调用retainreleaseautorelease等方法,以避免内存泄漏和野指针问题。

总体而言,ARC是iOS开发中推荐使用的内存管理机制。它可以帮助开发者更专注于业务逻辑的实现,减少了大量的内存管理代码,提高了代码的可读性和可维护性。同时,ARC在性能上也不会比MRC有明显的劣势,因为编译器会在编译时进行优化,生成高效的内存管理代码。

这篇关于iOS ------ MRC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/984793

相关文章

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

安卓玩机工具------小米工具箱扩展工具 小米机型功能拓展

小米工具箱扩展版                     小米工具箱扩展版 iO_Box_Mi_Ext是由@晨钟酱开发的一款适用于小米(MIUI)、多亲(2、2Pro)、多看(多看电纸书)的多功能工具箱。该工具所有功能均可以免root实现,使用前,请打开开发者选项中的“USB调试”  功能特点 【小米工具箱】 1:冻结MIUI全家桶,隐藏状态栏图标,修改下拉通知栏图块数量;冻结

iOS剪贴板同步到Windows剪贴板(无需安装软件的方案)

摘要 剪贴板同步能够提高很多的效率,免去复制、发送、复制、粘贴的步骤,只需要在手机上复制,就可以直接在电脑上 ctrl+v 粘贴,这方面在 Apple 设备中是做的非常好的,Apple 设备之间的剪贴板同步功能(Universal Clipboard)确实非常方便,它可以在 iPhone、iPad 和 Mac 之间无缝传输剪贴板内容,从而大大提高工作效率。 但是,iPhone 如何和 Wind

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

我的第一次份实习工作-iOS实习生-第三个月

第三个月 这个月有一个考核项目,是一个电子书阅读器,组长说很重要,是我的实习考核项目。 我的项目XTReader,这是我参考网上的一些代码,和模仿咪咕阅读做的,功能还不完善,数据的部分是用聚合数据做的。要收费的。   还有阅读页面,基本功能实现了一下。使用了autolayout,自适应布局,也是第一次用网络,第一次用数据库,第一次用自动布局。还有很多不足。 做了一周多,有个问题一直没

我的第一次份实习工作-iOS实习生-公司使用过的软件

bittorrentsync 素材,文件同步软件 cornerstone svn 软件开发合作 mark man 测量坐标的软件 SQLLite Manager 数据库操作软件

我的第一次份实习工作-iOS实习生-第二个月

第二个月 来公司过了一个月了。每天早上9点上班,到晚上6.30下班,上下班要指纹打卡,第一个月忘了打卡好多次(),然后还要去补打卡单。公司这边还安排了,工资卡办理,招商银行卡。开了一次新员工大会,认识了公司的一些过往,公司的要求等,还加了一下公司的企业QQ,还有其他的羽毛球群,篮球群。我加了下羽毛球群,也去打了一两次。第二个月的感受,感觉跟组里面的交流跟沟通都好少,基本上还有好多人不认识。想想也

我的第一次份实习工作-iOS实习生-第一个月

实习时间:2015-08-20 到 2015-12-25  实习公司;福建天棣互联有限公司 实习岗位:iOS开发实习生 第一个月: 第一天来公司,前台报道后,人资带我去我工作的地方。到了那,就由一个组长带我,当时还没有我的办公桌,组长在第三排给我找了一个位置,擦了下桌子,把旁边的准备的电脑帮我装了下,因为学的是iOS,实习生就只能用黑苹果了,这是我实习用的电脑。 帮我装了一下电脑后,开机

iOS如何隐藏系统状态栏

这里主要说明一下iOS7系统给状态栏的适配及隐藏带来的改变。 变化一: 不隐藏状态栏的情况下,StatusBar会直接显示在当前页面上,当前页面的会延伸到 StatusBar下方,顶到最上头。 这种显示方式在iOS7上是无法改变的,也无法通过设置或者配置类达到iOS6的状态栏效果。       所以在iOS7上进行页面布局的时候要考虑