7秒丶记忆吧 关注:2贴子:59
  • 1回复贴,共1
ARC的历史
在iOS1.0的时候,苹果公司没有开放手机开发接口,不存在iOS开发者这个概念。
在iOS2.0的时候,我们管理内存使用的技术数MRC机制。
在iOS5.0的时候,苹果公司推出了ARC机制。
黄金法则:“谁创建,谁释放,谁引用,谁管理”
在推出ARC的时候,很多人都说iOS的ARC和Android的GC机制很像,但是他们本身还是有很大的区别的。其中GCS是运行时特性,ARC是编译时特性。


IP属地:山东1楼2015-10-21 14:58回复
    一:局部对象
    我们在viewDidLoad中添加People *p = [People new]; NSLog(@"%s",__FUNCTION__);
    打印结果为:
    2015-10-19 13:16:10.589 textarc[2627:93432] -[People init]
    2015-10-19 13:16:10.600 textarc[2627:93432] -[ViewController viewDidLoad]
    2015-10-19 13:16:10.600 textarc[2627:93432] -[People dealloc]
    我们发现People这个对象别释放,从打印顺序上我们可以看到是在viewDidLoad执行完毕之后这个People对象被释放掉的。
    局部对象为什么会在函数执行完毕之后被释放掉呢?
    在viewDidLoad中,p是一个强引用,对象不会被释放,会打印NSLog中的内容。但是在函数执行完毕之后,强引用指针不在指向对象。根据上面的准则,没有强指针指向对象会被立刻释放,所以在执行完viewDidLoad之后,对象People会被释放掉。
    如果我们在viewDidLoad中这样写:
    __weak People *p = [People new];
    NSLog(@"%s",__FUNCTION__);
    我们可以猜测到打印结果就会跟上面的不同
    2015-10-19 13:22:10.783 textarc[2682:96983] -[People init]
    2015-10-19 13:22:10.783 textarc[2682:96983] -[People dealloc]
    2015-10-19 13:22:10.784 textarc[2682:96983] -[ViewController viewDidLoad]
    因为对象没有强指针引用,所以People会被释放,然后执行下面的打印。


    IP属地:山东3楼2015-10-21 15:01
    回复