文档章节

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

© 著作权归作者所有

共有 人打赏支持
_
粉丝 20
博文 130
码字总数 55043
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

jetbrains系产品IDEA:mac上面提示快捷键设置

原因 由于Mac上面的Ctrl+空格变成输入法切换的快捷键,在使用IDEA的过程中,代码提示很不方便,需要使用option+/这种传统eclipse上面的代码提示快捷键作为主要快捷键。 怎么修改? 移除【opt...

亚林瓜子
35分钟前
0
0
Exclipse 输出结果时换行

System.out.println(f1 + "\n" + d1 + "\n" + d2);

笑丶笑
35分钟前
1
0
怎样治疗标签不能触发onblur事件

I realize this was over a year ago, but it showed up for me in Google while trying to solve this same issue. It seems Chrome does not consider some elements, like body and ancho......

Weijuer
38分钟前
0
0
vue常见库安装

移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击。为了能够立即响应用户的点击事件,才有了FastClick。 安装fastclick npm insta...

林夏夕
40分钟前
0
0
kafka 教程(三) kafka Java API 编程

下午写

MrPei
41分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部