ARC————自动引用计数

一。内存管理/引用计数

1.引用计数式内存管理的方式(下面四种)
  对象操作      OC方法
  生成并持有对象  alloc/new/copy/mutableCopyd等方法
  持有对象      retain方法
  释放对象      release方法
  废弃对象      dealloc方法
  这些有关内存管理的方法,实际上不包括在该语言中,而是包含在Cocoa框架中用于OS X,IOS应用开发。
  Cocoa框架中的Foundation框架库的NSObject类担负内存管理的职责。
  OC内存管理中的alloc、retain、release、dealloc方法分别指代NSObject类的alloc类方法、retain实例方法、release实例方法和dealloc实例方法。
  a。自己生成的对象,自己持有。
    aa。使用以下名称开头的方法名意味着自己生成的对象只有自己持有:alloc、new、copy、mutableCopy。
    ab。[[NSObject alloc] init] = [NSObject new];
    ac。copy方法利用基于NSCopying方法约定,由各类实现的copyWithZone:方法生成并持有对象的副本。
    ad。mutableCopy方法里利用基于NSMutableCopying方法约定,由各类实现的mutableCopyWithZone:方法生成并持有对象的副本。
  b。非自己持有的对象,自己也能持有。
      id obj = [NSMutableArray array];
      [obj retain];
    通过retain方法,非自己持有的对象跟用上述方法生成并持有的对象一样,成为了自己所持有的方法。
  c。不再需要自己持有的对象时释放
    ca。自己持有的对象,一旦不再需要,持有者有义务释放该对象。释放用release方法。
    cb。自己生成而非自己所持有的对象,若用retain方法变为自己持有,也同样可以用release方法释放。
  d。无法释放非自己持有的对象

2.alloc/retain/release/dealloc实现
  在OC的对象中存有引用计数这一整数值。
  调用alloc或是retain方法后,引用计数值加1.
  调用release后,引用计数值减1.
  引用计数值为0时,调用dealloc方法废弃对象。
3.苹果的实现
4.autorelease及其实现
  autorelease的具体使用方法:
    a。生成并持有对象的NSAutoreleasePool对象。
    b。调用已分配对象的autorelease实例方法。
    c。废弃NSAutoreleasePool方法。

********************************
二。ARC规则
1.概要
  设置ARC有效的编译方法:
  使用clang(LLVM编译器)3.0或以上版本。
  指定编译器属性为“-fobjc-arc”。
2.内存管理的思考方式
  和上面的一样。
3.所有权修饰符
  a。OC编程中为了处理对象,可将变量类型定义为id类型或各种对象类型。
    id类型用于隐藏对象类型的类名部分,相当于C语言中常用的“void *”。
    对象类型就是指向NSObject这样的OC类的指针,如“NSObject *”。
  b。ARC有效时,id类型和对象类型同C语言其他类型不同,其类型上必须附加所有权修饰符。所有权修饰符有四种:    _strong/_weak/_unsafe_unretained/_autoreleasing。
  c。_strong修饰符
    ca。_strong修饰符是id类型和对象类型默认的所有权修饰符。
    cb。_strong修饰符表示对对象的“强引用”。持有强引用的变量在超出其作用域时被废弃,随着强引用的失效,引用的对象会随之释放。
    cd。附有_strong修饰符的变量之间可以相互赋值。
    ce。在OC类成员变量和方法参数上,都可以使用_strong修饰符。
    cf。_strong修饰符和_weak/_autoreleasing修饰符一起,可以保证将附有这些修饰符的自动变量初始化为nil。
      如:id _strong obj0; == id _strong obj0 = nil;
  d._weak修饰符
    da。使用_strong修饰符的成员变量在持有对象时,很容易发生循环引用。
    db。循环引用容易发生内存泄露。内存泄露就是应当废弃的对象在超出其生存周期后继续存在。
    dc。使用_weak修饰符可以避免循环引用。
    dd、_weak修饰符还有另一有优点。在持有某对象的弱引用时,若该对象被废弃,则此弱引用将自动失效且处于nil被赋值的状态(空弱引用)。
    de。综上,使用_weak修饰符可避免循环引用。通过检查附有_weak修饰符的变量是否为nil,可以判断被赋值的对象是否已废弃。
    df。但是,_weak修饰符只能用于ios5以上以及OS X Lion以上版本的应用程序。在ios4以及OS X Snow Leopard的应用程序中可使用_unsafe_unretained修饰符来代替。
  e。_unsafe_unretained修饰符
  f。_autoreleasing修饰符
    fa。ARC有效时autorelease方法不能使用,也不能使用NSAutoreleasePool类。但是,autorelease功能是起作用的。
    fb.id的指针或对象的指针在没有显式指定时会被附上_autoreleasing修饰符。
    fc。为了得到错误的详细信息,经常会在方法的参数中传递NSError对象的指针,而不是函数返回值。

4.规则
  a。不能使用retain、release、retainCount、autorelease。
    a1。内存管理是编译器的工作,因此没有必要使用内存管理的方法(retain、release、retainCount、autorelease)。
    a2。不能使用NSAllocateObject、NSDeallocateObject。
    a3。续遵守内存管理的方法命名规则
    a4。不要显示调用dealloc。
    a5。使用@autorelease块替代NSAutoreleasePool。
    a6。不能使用区域(NSZone)。
    a7。对象型变量不能作为C语言结构体的变量。
    a8.显示转换id和void*。
5.属性
  a。当ARC有效时,OC类的属性也会发生变化
  b。属性声明的属性与所有权修饰符的对应关系:
    assign ———— _unsafe_unretained
    copy ———— _strong
    retain ———— _strong
    strong ———— _strong
    unsafe_unretained ———— _unsafe_unretained
  以上各种属性赋值给指定的属性中就相当于赋值给附加各属性对应的所有权修饰符的变量中。
  其中,只有copy属性不是简单的赋值,它赋值的是通过NSCopying接口的copyWithZone:方法复制赋值源所生成的对象。
**************************
三。ARC的实现
ARC是“由编译器进行内存管理”的,但实际上只有编译器是无法完全胜任的,在此基础上还需要OC运行时库的协助。也就是说,ARC由以下工具、库来实现:
  clang(LLVM编译器)3.0以上
  objc4 Objective-C运行时库493.9以上。

时间: 2024-11-03 01:24:02

ARC————自动引用计数的相关文章

ARC自动引用计数

启动自动引用计数选项. 选择项目的属性文件 --> 搜索 automatic Reference --> Objective-C Automatic Reference Counting --> Yes ARC 和手动管理内存的区别. ARC 并不是GC在运行中判断引用计数是否为0,从而清除内存.而是在代码编译之前通过静态分析工具Analyze自动生成内存管理代码. 开启ARC后,不能再使用retain等系列手动内存管的方法,可以重写dealloc方法但不能再方法中[super deal

ARC自动引用计数学习笔记

1. 在 ARC 中,所有*outlet*属性都推荐使用 weak,这些 view 对象已经属于 View Controller 的 view hierarchy,不需要再次定义为 strong(ARC 中效果等同于 retain).唯一应该使用 strong 的 outlet 是 File's Owner,连接到 nib 的顶 层对象. 因为 tableView 和 searchBar 这两个 property 定义为 weak,当它们指向的 对象被释放时,这两个变量会自动设置为 nil. 当

OC17内存管理和自动引用计数

// //  ViewController.m //  OC17内存管理和自动引用计数 // //  Created by Zoujie on 15/10/25. //  Copyright ? 2015年 Zoujie. All rights reserved. // #import "ViewController.h" #import "Fraction.h" @interface ViewController () @end @implementation V

swift:自动引用计数ARC

Swift自动引用计数:ARC Swift使用自动引用计数(ARC)来跟踪并管理应用使用的内存.大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情.当实例不再被使用时,ARC会自动释放这些类的实例所占用的内存. 然而,在少数情况下,为了自动的管理内存空间,ARC需要了解关于你的代码片段之间关系的更多信息.本章描述了这些情况,并向大家展示如何打开ARC来管理应用的所有内存空间. 注意:引用计数只应用在类的实例.结构体(Structure)和枚举

Swift 自动引用计数机制ARC

Swift 使用自动引用计数(ARC)这一机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 的内存管理机制会一直起着作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的内存. 然而,在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息.本章描述了这些情况,并且为你示范怎样启用 ARC 来管理你的应用程序的内存. 注意: 引用计数仅仅应用于类的实例.结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储和传递. 自动引

手动和自动引用计数小结

自动引用计数:(arc)自动去释放掉你声明的,但是你用完了的对象内存. 手动引用计数:(mrc)需要手动去释放掉,你自己声明的对象. 现在的xcode是自动引用计数,但是你可以调用配件,将你的整个工程,或其中的某个.m变成手动引用计数. 将整个工程变成手动引用计数的步骤为: 1 2 3 4 将某个.m文件变成手动引用计数的步骤为: 在你所需要把自动引用计数变为手动引用计数的.m文件后面的  compiler flags中 写入-fno-objc-arc就可以了,写入-fobjc-arc则是自动引

进击的雨燕--------------自动引用计数

Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 内存管理机制会一直起作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的内存. 然而,在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息.本章描述了这些情况,并且为你示范怎样启用 ARC 来管理你的应用程序的内存. 注意:引用计数仅仅应用于类的实例.结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储和传递. 自动引用计数的工

自动引用计数

http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter2/16_Automatic_Reference_Counting.html 本页包含内容: 自动引用计数的工作机制 自动引用计数实践 类实例之间的循环强引用 解决实例之间的循环强引用 闭包引起的循环强引用 解决闭包引起的循环强引用 Swift 使用自动引用计数(ARC)这一机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 的内存管理机

swift详解之九---------------自动引用计数、循环引用

自动引用计数.循环引用(这个必须理解,必须看) 注:本文详细介绍自动引用计数,以及各种循环引用问题.一网打尽! 1. 自动引用计数原理 Swift 使用ARC机制来跟踪和管理你的内存,一般情况下,Swift 的内存管理机制会一直起着作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的内存. 然而,在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息.本章描述了这些情况,并且为你示范怎样启用 ARC 来管理你的应用程序的内存. 为了确保在