简述

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!

  

补充参见:

Swift中strong,weak,unowned关键字

iOS 内存管理机制和循环引用处理方法的更多相关文章

  1. iOS内存管理机制解析之MRC手动引用计数机制

    前言: iOS的内存管理机制ARC和MRC是程序猿參加面试基本必问的问题,也是考察一个iOS基本功是 否扎实的关键,这样深入理解内存管理机制的重要性就不言而喻了. iOS内存管理机制发展史 iOS 5 ...

  2. 浅谈iOS内存管理机制

    iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有 ...

  3. IOS内存管理「1」- 引用计数

  4. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...

  5. MRC、ARC内存管理机制

    MRC下,oc内存管理遵循"谁创建.谁释放.谁引用.谁管理"的机制,当创建或引用一个对象时,需要向她发送alloc,copy,retain消息,当释放该对象时需要发送release ...

  6. iOS 内存管理:从 MRC 到 ARC 实践

    对于 iOS 程序员来说,内存管理是入门的必修课.引用计数.自动释放等概念,都是与 C 语言完全不同的. iOS 内存管理的核心是引用计数. 接触 MRC 时遇到最头疼的问题就是:为什么那么多 rel ...

  7. iOS内存管理

    iOS内存管理的方式是引用计数机制.分为MRC(人式引用计数)和ARC(自动引用计数). 为什么要学习内存管理? 内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能.一个对象的生命 ...

  8. iOS内存管理(一)

    最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的 ...

  9. 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方 ...

随机推荐

  1. 总结一下一般游戏中3D模型各种勾边方法遇到的工程性问题

    以前做过简单的rim light勾边,几何勾边,这次又做了后处理的勾边,工程化的时候,都遇到很多问题,简单总结一下. 首先是火炬之光勾边效果,类似轮廓光的实现,简单的卡通渲染也是通过类似的算法加采样色 ...

  2. 虚拟机Ubuntu14/15启用root用户登录

    1. 为root用户设置密码 sudo passwd root 需要先输入一次当前用户的登陆密码,然后输入两次root用户的密码(自己设置). 2. 切换至root用户 sudo -s 3. 编辑登陆 ...

  3. 写给自己看的Linux运维基础(一) - 系统基础

    查看内核版本信息 uname -a 查看发行版本 cat /etc/issue 查看硬件配置 CPU: cat /proc/cpuinfo      more /proc/cpuinfo | grep ...

  4. HTML5 Canvas实现黑客帝国文字掉落效果

    效果: 原理: 用canvas逐行输出文字,然后让背景颜色逐渐加深,再随机中断某些列. 代码: HTML: <canvas id="c"></canvas> ...

  5. httpwebrequest 请求压缩,接受压缩的字符流请求

    请看图,客户端和服务端都使用gzip压缩. 客户端参数以json字符串形式gzip压缩,以二进制流发送到服务端:服务端接收到请求,解压缩gzip后,进行业务逻辑处理:处理完后在将返回值以json形式, ...

  6. Java-基础练习1

    1.      Java为什么能跨平台运行?请简述原理. 因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”——字节码.然后不同的硬件平台上安装有不同的Java虚拟机(J ...

  7. js笔记:匿名函数

    ;(function(){ alert('啥也没做');})(); 会弹框. 这是个匿名函数.最前面的分号可以去掉,仅仅是在代码压缩时防止出错. 该函数可以拆解成非匿名函数: var a= funct ...

  8. 使用Swift代码演示Cocoa框架

    通过使用简单的代码学习Cocoa框架,每一个例子都通过代码和StoryBoard实现,并且总结他们的各自特点 所有完整代码将会托管到github库,https://github.com/land-pa ...

  9. jquery实现简单的Tab切换菜单

    实现tab切换的主要html代码: <div class="container"> <ul class="tabs"> <li c ...

  10. NUnitForms 测试GUI应用程序的优秀工具

    著名的NUnit是单元测试的优秀工具,但是要在一个测试方法中启动GUI程序,比如Windows Form界面,这比较难做到.NUnitForms就是为解决这个问题产生的,它是NUnit的一个扩展程序, ...