Ios中的内存管理
Ios中的内存管理
xingjm8511 发表于9个月前
Ios中的内存管理
  • 发表于 9个月前
  • 阅读 6
  • 收藏 0
  • 点赞 0
  • 评论 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

共有 人打赏支持
粉丝 17
博文 111
码字总数 45809
×
xingjm8511
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: