本文介绍: Objective-C提供了两种内存管理机制MRC(MannulReferenceCounting)和ARC(AutomaticReferenceCounting),为Objective-C提供了内存的手动和自动管理。下面我们来探讨一下MRC和ARC的实现。
Objective-C提供了两种内存管理机制MRC(Mannul Reference Counting)和ARC(Automatic Reference Counting),为Objective-C提供了内存的手动和自动管理。下面我们来探讨一下MRC和ARC的实现。
OC的内存管理方式
1.自己生成的对象,自己持有
在iOS内存管理中,有四个这样的关键字:new、alloc、copy、mutableCopy,如果自身使用这些关键字的时候来产生对象,那么创建完之后,自身也就有了对象。
2.非自己生成的对象,自己也能持有
3.不再需要自己持有的对象时释放
3.无法释放非自己持有的对象
MRC实现原理
涉及方法
autorelease
autorelease即“自动释放”,是OC的一种内存自动回收机制,可以将一些临时变量通过自动释放池来回收统一释放。自动释放池销毁的时候,池子里面所有的对象都会做一次release操作
那么,autorelease释放与简单的release释放有什么区别呢?
调用 autorelease 方法,就会把该对象放到离自己最近的自动释放池中(栈顶的释放池,多重自动释放池嵌套是以栈的形式存取的),即:使对象的持有权转移给了自动释放池(即注册到了自动释放池中),调用方拿到了对象,但这个对象还不被调用方所持有。当自动释放池销毁时,其中的所有的对象都会调用一次release操作。
本质上,区别在于autorelease 方法不会改变调用者的引用计数,它只是改变了对象释放时机,不再让程序员负责释放这个对象,而是交给自动释放池去处理 。
autorelease 方法相当于把调用者注册到 autoreleasepool 中,ARC环境下不能显式地调用 autorelease 方法和显式地创建 NSAutoreleasePool 对象,但可以使用@autoreleasepool { }块代替(并不代表块中所有内容都被注册到了自动释放池中)。
关于retainCount
ARC
内存管理方案
修饰符
__strong修饰符
__strong对象相互赋值
__strong循环引用带来的内存泄漏
__weak修饰符
__unsafe_unretained修饰符
__autoreleasing修饰符
具体ARC规则
ARC的工作原理
Q&A
ARC在编译期和运行期做了什么?
我还需要为我的对象编写 dealloc 方法吗?
ARC它将 retains/releases 调用的代码放在哪了?
ARC 中仍然可能存在循环引用吗?
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。