• iOS学习笔记4 垃圾回收初涉


    之所以要加个初涉,当然是因为我自己也没好好研究过。。。不仅是Objective-c的,还是C#的。虽然.NET的面试里关于垃圾回收的问题的出现率超高,但我从来没回答好过。
    不过从另外一个侧面也可以说,就算几乎完全不懂也不管,也不会写出内存泄露的程序,这就是垃圾回收的优点(狡辩。。。

    =====================
    说正经的。
    学Objective-C,我看的第一本教材是《Programming in Objective-C 2.0 (2nd Edition)》,里面第一段命令行的范例代码,是以这段开头的:

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    最后以这段结尾:
    [pool drain];
    根据苹果官方的文档:
    https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html
    NSAutoreleasePool是用于支持Cocoa的引用计数内存管理系统(即垃圾回收系统)。
    学过C++就知道,在new(malloc)好一个object之后,必须记得delete(free)掉。如果有了垃圾回收,就可以只管生孩子(new),剩下的事情都交给政府(NSAutoReleasePool的池)来操心。当程序运行结束时,NSAutoreleasePool的这个pool被drain。于是pool会将release的释放消息发送到这个pool里的所有对象,让他们自己销毁。当然前提是,在生孩子之前,先手动建立好一个管事的政府(NSAutoReleasePool池)。

    来一个例子:

    int main(void) {
    NSAutoreleasePool *pool;
    pool = [[NSAutoreleasePool alloc] init];
    NSString *string;
    string = [[[NSString alloc] init] autorelease];
    /* use the string */
    [pool drain];
    }

    这段代码的效果等同于

    int main(void) {
    NSString *string;
    string = [[NSString alloc] init];
    /* use the string */
    [string release];
    }

    更多内容可以参考苹果官方的《Memory Management Policy》
    http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH
    这可以算一个半自动半手动的垃圾回收方式。

    =====================
    不过实际在XCode4.6里创建Foundation命令行程序,生成的代码为
    @autoreleasepool {
    }
    其实就是一个语法糖,将[[NSAutoreleasePool alloc] init]和[pool drain]用糖衣包了起来,本质上还是半自动半手动的垃圾回收。
    比较老的教材里没有这个语法糖的介绍。不过基本世面上的Objective-C和iOS开发的教材至少都慢1-2个版本。

    =====================
    而在iOS的代码里,根本就看不到@autoreleasepool或[[NSAutoreleasePool alloc] init]。这是因为iOS的程序默认启用了ARC(Automatic Reference Counting)。ARC是从2011年,随着Mac OSX Lion和iOS5一起引入的。XCode 4.2+,Mac OSX 10.6+, iOS4.0+支持。而且对于iOS应用,ARC无法关闭。嘛,这也应该算一种必要的安全措施吧。

    ARC从本质上来讲,不是一个垃圾回收器,而是有编译器辨识出什么时候需要保留对象,什么时候需要释放,并根据这个判断来机动(机器手动)插入合适的retain或release代码。一大好处就是内存管理相关的代码基本全部可以去掉了。

    用了ARC,就不能再用NSAutoreleasePool了。

    详细内容也可以参考wiki:
    http://en.wikipedia.org/wiki/Automatic_Reference_Counting

    http://stackoverflow.com/questions/6385212/how-does-the-new-automatic-reference-counting-mechanism-work

    更多关于Clang的诞生的文章,有兴趣的话可以读读这篇当休闲阅读:
    http://www.programmer.com.cn/9436/
    不过作者是过于死忠的果粉,请注意不要被洗脑。

  • 相关阅读:
    svn 指定不更新目录
    C# 修改win环境变量 来加载dll库
    基本组件
    在SD卡上创建/删除文件夹 使用DDMS透视图管理SD卡
    linux中图形界面改成文本
    表格布局和线性布局
    文件操作
    静态库的生成和调用
    船载电子海图系统(E C S )概述
    GPS全球定位系统构成及原理
  • 原文地址:https://www.cnblogs.com/galaxyyao/p/3048372.html
Copyright © 2020-2023  润新知