文档章节

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
海淀
程序员
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
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
那些在学习iOS开发前就应该知道的事(part 2)

英文原文:Things I wish I had known before starting iOS development—Part 2 如果你还没读这篇文章的第一部分,请先读完了再来看第二部分。 那些在学习iOS开发前就应该知道的事(part 1)...

TomatosX
2015/06/12
0
0
C++ Primer Plus(十七)——输入、输出和文件

cerr和clog对象与标准错误流对应,但cerr不被缓冲。 2. streambuf类为缓冲区提供了内存,并提供了用于填充缓冲区、访问缓冲区内容、刷新缓冲区和管理缓冲区内存的类方法。iosbase类表示流的一...

吃一堑消化不良
2017/11/04
0
0
面试官自述:面向高级开发人员的iOS面试问题

当您准备进行技术性iOS面试时,了解您可能会询问哪些主题以及经验丰富的iOS开发人员期望什么是非常重要的。 这是许多硅谷公司用来衡量iOS候选人资历水平的一系列问题。 这些问题涉及iOS开发的...

菇哒微课
04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

shell特殊符号、cut、sort、uniq、wc、tee、tr、split命令

10月15日任务 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号下 cut 命令 cut作用:截取字符串 用法如下:cat /etc/passwd |head -2 |cut -d ...

hhpuppy
18分钟前
0
0
Springboot实现filter拦截token验证和跨域

背景 web验证授权合法的一般分为下面几种 1使用session作为验证合法用户访问的验证方式 使用自己实现的token 使用OCA标准 在使用API接口授权验证时,token是自定义的方式实现起来不需要引入其...

funnymin
53分钟前
1
0
linux使用ntfs-3g操作ntfs格式硬盘

Linux内核目前只支持对微软NTFS文件系统的读取。 NTFS-3G 是微软 NTFS 文件系统的一个开源实现,同时支持读和写。NTFS-3G 开发者使用 FUSE 文件系统来辅助开发,同时对可移植性有益。 安装 ...

linuxprobe16
今天
1
0
kubeadm部署kubernetes集群

一、环境要求 这里使用RHEL7.5 master、etcd:192.168.10.101,主机名:master node1:192.168.10.103,主机名:node1 node2:192.168.10.104,主机名:node2 所有机子能基于主机名通信,编辑...

人在艹木中
今天
14
0
Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部