zoukankan      html  css  js  c++  java
  • Objective C----手动管理内存和自动管理内存

    对象的引用计数(Reference Counting)

    正常情况下,当一段代码需要访问某个对象时,该对象的引用的计数加1;当这段代码不再访问该对象时,该对象的引用计数减1,表示这段代码不再访问该对象;当对象的引用计数为0时,表明程序已经不再需要该对象,系统就会回收该对象所占用的内存。

    Ø  当程序调用方法名以alloc、new、copy、mutableCopy开头的方法来创建对象时,该对象的引用计数加1。

    Ø  程序调用对象的retain方法时,该对象的引用计数加1。

    Ø  程序调用对象的release方法时,该对象的引用计数减1。

    NSObject 中提供了有关引用计数的如下方法:

    Ø  —retain:将该对象的引用计数器加1。

    Ø  —release:将该对象的引用计数器减1。

    Ø  —autorelease:不改变该对象的引用计数器的值,只是将对象添加到自动释放池中。

    Ø  —retainCount:返回该对象的引用计数的值。

    自动释放池

    为了实现被函数、方法返回的对象能被延迟销毁,有如下两种做法:

    Ø  程序每次获取并使用完其他方法、函数返回的对象之后,立即调用该对象的release方法将函数、方法返回对象的引用计数减1。

    Ø  使用自动释放池进行延迟销毁。

    手动内存管理的规则

    Ø  调用对象的release方法并不是销毁对象,只是将该对象的引用计数减1;当一个对象的引用计数为0时,系统会自动调用该对象的dealloc方法来销毁该对象。

    Ø  当自动释放池被回收时,自动释放池会依次调用池中每个对象的release方法。如果该对象调用release方法后引用计数变为0,那么该对象将要被销毁;否则该对象可以从自动释放池中“活”下来。

    Ø  当程序使用alloc、new、copy、mutableCopy开头的方法创建对象后,该对象的引用计数为1,当不再使用该对象时,需要调用该对象的release方法或者autorelease方法。

    Ø  如果使用retain方法为对象增加过引用计数,则用完该对象后需要调用release方法来减少该对象的引用计数,并保证retain次数与release次数相等。

    Ø  如果通过其他方法获取了对象,且该对象是一个临时对象,如果在自动释放上下文中使用该对象,那么使用完成后无须理会该对象的回收吗,系统会自动回收该对象。如果程序需要保留这个临时对象,则需要手动调用retain来增加该临时对象的引用计数;或者将该临时对象赋值给retain、strong、copy指示符修饰的属性。

    Ø  在Cocoa或iOS的事件循环中,每个事件处理方法执行之前会创建自动释放池,方法执行完成后会回收自动释放池。如果希望自动释放池被回收后,池中某些对象能“活”下来,程序必须增加该对象的引用计数,保证该对象的引用计数大于它调用autorelease的次数。

    自动引用计数(Automatic Reference Counting)

    iOS 5引入ARC机制

    选中TARGETS分类下的项目名,在编辑区上方单击Build Settings标签页,在此标签页搜索Objective-C

    AutomaticReference Counting选项,如果将该选项设为Yes,表明启用ARC,设为No则表明关闭ARC选项。

    为了单独关闭某个文件的ARC机制,可单击图1所示窗口上方的Build Phases标签页,然后展开Compile Sources分类列表,即可看到项目中所有的源代码。接下来就可以对指定的源代码添加-fno-objc-arc编译选项,如图2所示。

  • 相关阅读:
    浅释一下,为什么要使用接口?
    枚举的简单使用
    最富有的人
    拜读websharp时,发现的几处问题(二)
    如何规划职业发展道路如何规划职业发展道路(ZT)
    在.NET环境中使用单元测试工具NUnit(ZT)
    [转贴]不得不知的几个可怕信息!
    ASP.NET中数据导入至Excel
    拜读websharp时,发现的几处问题(一)
    合并DataGrid相同单元格
  • 原文地址:https://www.cnblogs.com/congli0220/p/4939470.html
Copyright © 2011-2022 走看看