欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析:iOS开发中的自动引用计数与手动引用计数

时间:11-12 民间故事 提交错误

老铁们,大家好,相信还有很多朋友对于深入解析:iOS开发中的自动引用计数与手动引用计数和的相关问题不太懂,没关系,今天就由我来为大家分享分享深入解析:iOS开发中的自动引用计数与手动引用计数以及的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

图1 MRC与ARC1. Objective-C语言中的MRC(MannulReference Counting)的区别示意图在MRC的内存管理模式中,与变量管理相关的方法有:retain、release和autorelease。保留和释放方法对引用计数进行操作。当引用计数为零时,内存被自动释放。并且可以使用NSAutoreleasePool 对象来管理添加到自动释放池(autorelease 调用)的变量,并在排空时回收内存。

(1)retain,该方法的作用是将内存数据的所有权附加到另一个指针变量上,并且引用数加1,即retainCount+=1;

(2)release,该方法是将指针变量对内存数据的所有权释放,并将引用数减1,即retainCount-=1;

(3)autorelease,该方法是将对象的内存管理放入autoreleasepool中。

示例代码:

//假设Number是一个预定义的类

数字* num=[[数字分配] init];

Number* num2=[numretain];//此时引用计数+1,现在为2

[num2 发布]; //num2释放内存数据的所有权。引用计数-1,现在为1;

[num release];//num释放内存数据的所有权。引用计数-1,现在为0;

[num add:1 and 2];//bug,此时内存已经释放。

//autoreleasepool的使用在MRC管理模式下,我们放弃了之前NSAutoreleasePool对象的用法和使用。新方法是@autoreleasepool

@autoreleasepool {

数字* num=[[数字分配] init];

[num autorelease];//内存的释放由autoreleasepool管理

}Objective-c 中标识符与属性的配对可以总结为:

@property (非原子/原子,保留/分配/复制,只读/读写) Number* num;

(1)nonatomic/atomic,表示该属性对于多线程是否安全以及是否使用线程锁。默认是原子的。

(2)retain/assign/copy与该属性的内存管理有关。

一个。分配** 是默认值。在@synthesize创建的setter中,只是将值赋值给属性,不操作保留计数。我的理解是“分配”应该用于非指针属性。

b.当属性是指向对象的指针时,需要保留**。 @synthesize 生成的setter 将保留(也称为添加保留计数)对象。使用完该对象后,您需要释放该对象。

c.当对象可变时需要copy。如果您需要对象此时的值,并且不希望该值反映该对象的其他所有者所做的任何更改,请使用此值。完成该对象后,您需要释放该对象,因为您保留了副本。

(3)readwrite /readonly- 默认为“读写”。当您@synthesize 时,将为您创建getter 和asetter。如果您使用“readonly”,则不会创建任何setter。将其用于对象实例化后您不想更改的值。

2. Objective-c语言中的ARC(AutomaticReference Counting)ARC中与内存管理相关的标识符可以分为变量标识符和属性标识符。变量的默认值为__strong,属性的默认值为unsafe_unretained。自动释放池也存在。

变量的标识符是:

(1) __strong,是默认值。只要有一个强指针指向一个对象,它就保持“活着”。

(2) __weak,指定不使被引用对象保持活动状态的引用。当没有对对象的强引用时,弱引用设置为nil。

(3)__unsafe_unretained,指定一个引用,不会使被引用的对象保持活动状态,并且当没有对该对象的强引用时,不会设置为nil。如果它引用的对象被释放,则指针将悬空。

(4)__autoreleasing,用于表示通过引用(id *)传递并在返回时自动释放的参数,由Autoreleasepool 管理。

对于变量标识符的使用:

__strong Number* num=[[Number alloc]init];

在ARC内存管理模式下,其属性的标识符如下:

@property(nonatomic/atomic, allocate/retain/strong/weak/unsafe_unretained/copy,readonly/readwrite) Number* num;//默认为unsafe_unretained。 allocate/retain/copy与MRC下的属性标识符含义相同,strong与retain类似,assign与unsafe_unretained类似,strong/weak/unsafe_unretained与ARC下的变量标识符含义相同。它只是一个用户属性的标识符,以及一个变量的标识符(带有两个下划线__)。列出的其他标识符与MRC 中的含义相同。

(1) 对于分配,可以在标量类型(例如int)上使用此属性。你可以想象一个浮点数,它不是一个对象,所以它不能被保留或复制。

(2) 对于复制,指定应使用对象的副本(深复制),之前的值发送释放消息。基本上与保留类似,但不是增加引用计数,而是分配一块新内存来保存它。特别是对于NSString,如果您不想更改现有的,请使用此选项,因为NSMutableString 也是一种NSString。

当Core Foundation与objective-cObject交换时,需要使用的ARC管理机制有:

(1) (__bridge_transfer) op 或CFBridgingRelease(op) 用于在将CFTypeRef 传输到ARC 时消耗CFTypeRef 的保留计数。这也可以表示为

id someObj=(__bridge) op;

CFRelease(op);(2) (__bridge_retained) op 或CFBridgingRetain(op) 用于将NSObject 移交给CF-land,同时给它+1 保留计数。您应该像处理CFStringCreateCopy() 的结果一样处理以这种方式创建的CFTypeRef。这也可以表示为

CFRetain((__bridge CFType)op);

用户评论

毒舌妖后

终于理解了 ARC 和 MRC 的区别!

    有5位网友表示赞同!

孤者何惧

想学 iOS 开发一直被这些内存管理搞得头疼,这篇文章正好解答疑惑。

    有20位网友表示赞同!

凝残月

看了一些资料,发现 ARC 真的是太方便了!

    有6位网友表示赞同!

站上冰箱当高冷

学习 iOS 还真需要花时间和精力,好在现在有这么好的教程!

    有12位网友表示赞同!

玩味

ARC 简化了很多操作,感觉开发效率大大提高了。

    有16位网友表示赞同!

命运不堪浮华

MRC 就有点难度大了,不过还是需要理解一下的。

    有20位网友表示赞同!

予之欢颜

对比了 ARC 和 MRC 的优缺点,原来还有这么多地方不同...

    有10位网友表示赞同!

笑叹★尘世美

之前一直使用 ARC 开发,现在来了解下 MRC 的原理。

    有12位网友表示赞同!

金橙橙。-

iOS 开发入门确实要从基础知识开始,比如内存管理。

    有8位网友表示赞同!

一笑傾城゛

感觉这篇文章讲解很透彻,我终于弄明白了!

    有19位网友表示赞同!

玻璃渣子

分享一下这篇文章给我的小伙伴,他也在学习 iOS 开发呢!

    有14位网友表示赞同!

花花世界总是那么虚伪﹌

希望能再深入了解一下 ARC 的具体实现机制...

    有9位网友表示赞同!

全网暗恋者

现在开发项目中几乎都是使用 ARC 了吧?

    有10位网友表示赞同!

逾期不候

MRC 的代码看着确实会比较复杂,需要多加练习。

    有11位网友表示赞同!

屌国女农

学习这些知识对理解 iOS 开发的底层逻辑很重要啊!

    有6位网友表示赞同!

凉凉凉”凉但是人心

希望以后还能看到一些关于内存管理的其他教程!

    有12位网友表示赞同!

拽年很骚

iOS 开发真是个很有挑战性的领域!

    有17位网友表示赞同!

龙吟凤

不过掌握了 ARC 和 MRC 的技巧,开发起来就容易很多了。

    有15位网友表示赞同!

【深入解析:iOS开发中的自动引用计数与手动引用计数】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活