iOS 内存管理机制和循环引用处理方法
简述
ARC: 自动引用计数, Automatic Reference Counting
MRC: Mannul Reference Counting
ARC工作原理
1.当每次创建一个新实例时,ARC会分配一块内存用来存储实例信息,在内存中会包含实例的类型信息,以及这个实例所有的相关属性的值。
2.如果该实例不再被使用时,ARC会自动释放实例所占用的内存,并让释放的内存存储其他的数据。这样能保证使用的实例不会一直占用内存空间。
3.ARC收回和释放了正在被使用的实例,该实例的属性和方法将不能再被访问和调用,一旦尝试调用,会造成应用程序的崩溃
4.为了保证使用中的实例不会被销毁,ARC会跟踪和计算每一个实例被多少属性,常量和变量所引用,一旦有引用,都会对实例创建强引用。强引用会将实例牢牢的保持住,只要强引用还在,实例就不会被销毁。
循环强引用问题
循环强引用是指两个对象相互进行创建了强引用,这样的话2个实例的内存将永远不会被释放。
这样的话会造成内存泄漏。可以通过弱引用(Weak Reference)或无主引用(Unowned Reference)解决这个问题。
代码中常用写法
OC
//定义一个宏
#define WS(weakSelf) __weak __typeof(&*self)weakSelf = self; //调用的时候
WS(weakSelf);
[XPApiManager getVideoListWithType:self.listType pageIndex:self.pageIndex pageSize:self.pageSize progress:^(NSProgress *progress) {
[weakSelf.tableView reloadData];
} finished:^(NSString *msg, id responseObject) { }
@property (weak, nonatomic) id<XPDetailMenuPopViewDelegate> delegate; @property (weak, nonatomic) IBOutlet UIImageView *imgFavorite;
Swift
lazy var strHTML: () -> String = {
[unowned self] in
//代码编写区
self.XXX
}
XPHomeViewModel.loadCategoryGroup { [weak self] (outGroups) in
self!.outGroups = outGroups
}
weak var tmpSelf = self
CouponData.loadCouponData { (data, error) -> Void in
tmpSelf!.couponTableView?.reloadData()
}
weak var delegate: YMCategoryBottomViewDelegate? @IBOutlet weak var tableView: UITableView!
补充参见:
iOS 内存管理机制和循环引用处理方法的更多相关文章
- iOS内存管理机制解析之MRC手动引用计数机制
前言: iOS的内存管理机制ARC和MRC是程序猿參加面试基本必问的问题,也是考察一个iOS基本功是 否扎实的关键,这样深入理解内存管理机制的重要性就不言而喻了. iOS内存管理机制发展史 iOS 5 ...
- 浅谈iOS内存管理机制
iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有 ...
- IOS内存管理「1」- 引用计数
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
- MRC、ARC内存管理机制
MRC下,oc内存管理遵循"谁创建.谁释放.谁引用.谁管理"的机制,当创建或引用一个对象时,需要向她发送alloc,copy,retain消息,当释放该对象时需要发送release ...
- iOS 内存管理:从 MRC 到 ARC 实践
对于 iOS 程序员来说,内存管理是入门的必修课.引用计数.自动释放等概念,都是与 C 语言完全不同的. iOS 内存管理的核心是引用计数. 接触 MRC 时遇到最头疼的问题就是:为什么那么多 rel ...
- iOS内存管理
iOS内存管理的方式是引用计数机制.分为MRC(人式引用计数)和ARC(自动引用计数). 为什么要学习内存管理? 内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能.一个对象的生命 ...
- iOS内存管理(一)
最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的 ...
- iOS 内存管理-copy、 retain、 assign 、readonly 、 readwrite、nonatomic、@property、@synthesize、@dynamic、IB_DESIGNABLE 、 IBInspectable、IBOutletCollection
浅谈iOS内存管理机制 alloc,retain,copy,release,autorelease 1)使用@property配合@synthesize可以让编译器自动实现getter/setter方 ...
随机推荐
- C++混合编程之idlcpp教程Python篇(2)
在上一篇 C++混合编程之idlcpp教程(一) 中介绍了 idlcpp 工具的使用.现在对 idlcpp 所带的示例教程进行讲解,这里针对的 Python 语言的例子.首先看第一个示例程序 Pyth ...
- oracle 查看运行中sql
sys用户登录 SELECT b.sid oracleID, b.username 登录Oracle用户名, b.serial#, spid 操作系统ID, paddr, sql_text 正在执行的 ...
- ReactiveCocoa 5.0 初窥:可能是最痛的一次升级
RAC 5.0 相比于 4.0 有了巨大的变化,不仅是受 swift 3.0 大升级的影响,RAC 对自身项目结构的也进行了大幅度的调整.这个调整就是将 RAC 拆分为四个库:ReactiveCoco ...
- 了解linux下RAID(磁盘阵列)创建和管理
现在的操作系统,不论是windows 还是linux都具有raid的功能,RAID 分为硬件 RAID 和软件 RAID, 硬件 RAID 是通过 RAID 卡来实现的,软件RAID是通过软件实现的, ...
- [JS] HTML QQ分享界面js代码
@ - @ :可以自己指定分享内容等....内含JS脚本 <html> <head> <title></title> <script type=& ...
- [游戏学习27] MFC 匀速运动
>_<:理解上一个时间函数的概念和用法,本节的实现也比较简单 >_<:就是简单的绘图+时间函数 >_<:TicTac.h #define EX 1 //该点左鼠标 ...
- Cocos2d-x3.6 Android编译问题
在Cocod2d-x论坛上看到越来越多人吐槽新版本更新太快,改动太大,而且经常有BUG导致升级要折腾很久很久..但我就是喜欢折腾,喜欢升级到最新版本,看看有了哪些新功能,哪些改进.为此也折腾了不少,遇 ...
- 阻塞队列BlockingQueue用法
多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享. 假设我们有若干生产者线程,另外又有若干个消费者线程.如果生产者线程需 ...
- Linux内存寻址
我会尽力以最简洁清晰的思路来写这篇文章. 所谓内存寻址也就是从写在指令里的地址,转化为实际物理地址的过程.因为操作系统要兼顾许多东西,所以也就变得复杂. 逻辑地址 → 线性地址 → 物理地址 逻辑地址 ...
- atitit.表格的绑定client side 最佳实践
atitit.表格的绑定client side 最佳实践 1. 框架选型 1 2. #---原理和流程 1 1. 方法1 1 2. Dwr 例子 1 3. 方法2 2 4. Jq例如 2 1. 框架选 ...