文档章节

Ios中的内存管理

_
 _OUTMAN_
发布于 2017/05/05 07:51
字数 591
阅读 6
收藏 0

内存回收对象的判定,主要有两种方式,一是引用计数算法,二是可达性分析算法。

关于算法的简介可以参考:https://my.oschina.net/android520/blog/744490

Objective-C使用的是引用计数算法;Android使用的是可达性算法。

引用计数算法:当一个对象在创建之后它的引用计数器值加1,当调用这个对象的alloc、retain、new、copy方法之后引用计数器值自动在原来的基础上加1,当调用这个对象的release方法之后它的引用计数器值减1,如果一个对象的引用计数器值为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。

引用计数算法,无法解决循环引用的问题,需要开发者自己处理,一般需要自己释放或使用弱引用方式。

在引入ARC(Automatic Reference Counting)自动引用计数机制之前,OC的内存管理需要由开发人员手动维护。在Xcode4.2之后的版本中引入了ARC,程序编译时,Xcode可以自动为你的代码添加内存释放代码,如果编写手动释放代码Xcode会报错。

Ios中的强(strong)引用和弱(weak)引用

Ios中的弱引用和Java中有一点差别,

Java:有垃圾回收机制,只有垃圾回收器扫描到弱引用,且没有强引用指向该内存时,则会被释放。

https://my.oschina.net/android520/blog/842678

Ios:使用引用计数算法,只要没有强引用指向该内存,则立即释放。

通过代码看下

__weak Student *weakStudent = [Student alloc];
Student *strongStudent = [Student alloc];
    
{
    weakStudent = [weakStudent initWithName: @"弱引用" andAge: 10 andScore: 100];
    strongStudent = [strongStudent initWithName: @"强引用" andAge: 10 andScore: 100];
    weakStudent = strongStudent;
        
    NSLog(@"Weak is %@, Strong is %@", weakStudent, strongStudent);
        
    strongStudent = nil;// 断开强引用指针
        
    NSLog(@"Weak is %@, Strong is %@", weakStudent, strongStudent);
        
//    Student *strongLocal = [[Student alloc] initWithName: @"局部强引用" andAge: 50 andScore: 100];
//    weakStudent = strongLocal;
}
NSLog(@"Weak is %@, Strong is %@", weakStudent, strongStudent);
// 输出结果
IosDemo[9203:322570] Weak is <Student: 0x60000026b340>, Strong is <Student: 0x60000026b340>
IosDemo[9203:322570] Weak is (null), Strong is (null)
IosDemo[9203:322570] Weak is (null), Strong is (null)

因此,Java在垃圾回收(GC)时,需要StopTheWorld,即其他线程需要暂停,如果大量内存的申请、释放,增加了GC的时间,可能导致卡顿。

参考

http://www.jianshu.com/p/7903c8283e26

http://blog.csdn.net/u012046379/article/details/50838777

© 著作权归作者所有

共有 人打赏支持
_
粉丝 21
博文 133
码字总数 63959
作品 0
海淀
程序员
私信 提问
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
11/15
0
0
理解 iOS 和 macOS 的内存管理

在 iOS 和 macOS 应用的开发中,无论是使用 Objective-C 还是使用 swift 都是通过引用计数策略来进行内存管理的,但是在日常开发中80%(这里,我瞎说的,8020 原则嘛)以上的情况,我们不需要...

Mr_zebra
11/20
0
0
iOS天气动画、高仿QQ菜单、放京东APP、高仿微信、推送消息等源码

iOS精选源码 TYCyclePagerView iOS上的一个无限循环轮播图组件(http://www.code4app.com/thread-14507-1-1.html) iOS高仿微信完整项目源码(http://www.code4app.com/thread-14695-1-1.html)......

sunnyaigd
06/12
0
0
ArcGIS for iOS 开发系列(1) – 基本概念

1.1 iOS简介 2006年苹果公司发布了智能手机iPhone,卓越的外形设计和新颖的触摸式交互,令其迅速风靡全球,随后发布的平板电脑iPad同样也取得了巨大成功,二者所搭载的都是iOS智能移动操作系...

长平狐
2012/11/28
867
0
iOS精美过度动画、视频会议、朋友圈、联系人检索、自定义聊天界面等源码

iOS精选源码 iOS 精美过度动画源码(http://www.code4app.com/thread-14827-1-1.html) iOS简易聊天页面以及容联云IM自定义聊天页面的实现思路(http://www.code4app.com/thread-30348-1-1.htm...

sunnyaigd
07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

深入理解Java PriorityQueue

ava中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对...

java菜分享
7分钟前
1
0
玩手机与做实验

看过这样一个故事:说的是在二十世纪二十年代初的一个深夜,担任英国剑桥大学卡文迪许实验室主任的卢瑟福来实验室检查,发现一位学生还在做实验。卢瑟福就问他:“你上午做什么了?”学生回答...

Bob2100
17分钟前
0
0
Kafka流式处理

Kafka Streams 初识流式处理 什么是数据流 数据流(也叫事件流)是无边界数据集的抽象表示。无边界意味着无限和持续增长。无边界数据集之所以是无限的,是因为随着时间的推移,新记录会不断加...

东都大狼狗
26分钟前
2
0
Mysql主从复制(拓展博客文章扩充知识面)

#不停库不锁表在线主从配置 使用 Xtrabackup 在线对MySQL做主从复制 1.数据量大的话还是建议使用工具例如xtrabackup,mysqldump比较适合操作10G以下的数据备份复制。 2.做业务之前考虑清楚具...

robertt15
31分钟前
1
0
docker快速搭建几个常用的第三方服务

本次和大家分享的内容是使用docker快速搭建工作中常用的第三方的服务,对于有一些互联网背景的公司来说,以下几个服务都是很需要的:redis,rabbit,elasticsearch; 如果想学习Java工程化、...

编程SHA
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部