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方 ...
随机推荐
- 从0开始学Swift笔记整理(二)
这是跟在上一篇博文后续内容: --函数中参数的传递引用 类是引用类型,其他的数据类型如整型.浮点型.布尔型.字符.字符串.元组.集合.枚举和结构体全部是值类型. 有的时候就是要将一个值类型参数以引用方 ...
- 分分钟用上C#中的委托和事件之窗体篇
上次以鸿门宴的例子写了一篇名为<分分钟用上C#中的委托和事件>的博文,旨在帮助C#初学者迈过委托和事件这道坎,能够用最快的速度掌握如何使用它们.如果觉得意犹未尽,或者仍然不知如何在实际应用 ...
- nginx做反向代理并防盗链
nginx做反向代理真的非常简单,只需设置location+proxy_pass即可. 防盗链配置有些复杂,需要注意的地方: 在防盗链的location中需要再设置一下proxy_pass(在这里走了 ...
- OWIN规范中最让人费解的地方
OWIN defines a standard interface between .NET web servers and web applications. OWIN最让人费解不是OWIN的五大角 ...
- VisualSvn server 权限配置
库上,配置 EveryOne 有读写权限. 下面的文件夹,再根据情况,取消 EveryOne 的读写权限,添加另一个用户组的读写权限. 它的规则是: 子目录权限覆盖父目录权限.
- tomcat通过conf-Catalina-localhost目录发布项目详解
Tomcat发布项目的方式大致有三种,但小菜认为通过在tomcat的conf/Catalina/localhost目录下添加配置文件,来发布项目,是最佳选择. 因为这样对tomcat的入侵性最小,只需 ...
- IE11下Forms身份认证无法保存Cookie的问题
ASP.NET中使用Forms身份认证常见的做法如下: 1. 网站根目录下的Web.config添加authentication节点 <authentication mode="For ...
- mac 隐藏、显示文件
方法一:打开终端 显示:defaults write com.apple.finder AppleShowAllFiles -bool true隐藏:defaults write com.apple. ...
- 虚拟机锁定文件失败,开启模块snapshot失败解决办法
今天由于没有正常关闭虚拟机,导致出现打开虚拟机提示:锁定文件失败 虚拟机开启模块snapshot失败,后来从网上找打了资料解决了.解决办法:一:打开你存放虚拟机系统文件的文件夹,注意,是系统文件,不是 ...
- paip.java c++得到当前类,方法名称以及行号
paip.java c++得到当前类,方法名称以及行号 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn ...