ARC自动引用计数

启动自动引用计数选项.

选择项目的属性文件 --》 搜索 automatic Reference --》 Objective-C Automatic Reference Counting --》 Yes

ARC 和手动管理内存的区别。

ARC 并不是GC在运行中判断引用计数是否为0,从而清除内存。而是在代码编译之前通过静态分析工具Analyze自动生成内存管理代码。

开启ARC后,不能再使用retain等系列手动内存管的方法,可以重写dealloc方法但不能再方法中[super dealloc]



Core Foundation的东西仍然需要手动release,即以CF打头的对象。因为CF不在ARC的范围内。

未启用ARC之前

  1. @implementation NonARCObject
  2. -(id)initWithName:(NSString *)newName {
  3. self = [super init];
  4. if (self) {
  5. [name release] ;
  6. name = [newName retain];
  7. }
  8. return self;
  9. }
  10. -(void)dealloc {
  11. [name release];
  12. [super dealloc];
  13. }
  14. @end

启用ARC之后

  1. @implementation NonARCObject
  2. -(id)initWithName:(NSString *)newName {
  3. if (self) {
  4. // 编译器自动加入 [name release]; name = [newName retain];
  5. name = newName;
  6. }
  7. return self;
  8. }
  9. @end

强引用和弱引用

强引用和若引用的概念在ARC环境中才存在。

强引用

强引用指的是会使对象引用计数器+1的引用。类似于retain。
当所有强引用全部release 的时候对象才会被清理。

  • __strong 关键字来定义强引用
  • @property(strong) 来表示强引用属性。

弱引用

弱引用不会使对象引用计数器+1的引用。类似于assgin,直接指针赋值。

  • __weak 关键字来定义弱引用
  • @property(week) 来表示若引用属性。

什么时候使用若引用?

在ARC环境中经常出现父子引用的情况 。

Person 类中具有Child 类对象指针。
Child 类中具有Person 类对象指针。

如果Person 引用的 Child 指针是强引用,并且Child 引用的Person 类也是强引用,将会导致对象无法释放的问题。
1.Person 类释放会去释放 Child
2.Child 类释放的时候又要去释放Person
父子关系都是强引用,释放的时候会出现循环引用无法释放。

使用若引用即可解决,子类含有父类的若引用。

  1. Person 类强引用 Child 类。
  2. Child 类弱引用 Person类。

Person 类释放的时候回去释放Child , Child 发现自身弱引用一个Person 则不会去清理Person,只会将Person 的引用设置为nil ;

若引用引用的对象被清理后,系统自动将引用设置为nil,所以若引用并不会出现僵尸指针的情况

僵尸指针:指向一块被清理掉内存的指针。

时间: 2024-12-25 06:21:24

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

ARC————自动引用计数

一.内存管理/引用计数 1.引用计数式内存管理的方式(下面四种) 对象操作 OC方法 生成并持有对象 alloc/new/copy/mutableCopyd等方法 持有对象 retain方法 释放对象 release方法 废弃对象 dealloc方法 这些有关内存管理的方法,实际上不包括在该语言中,而是包含在Cocoa框架中用于OS X,IOS应用开发. Cocoa框架中的Foundation框架库的NSObject类担负内存管理的职责. OC内存管理中的alloc.retain.release

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 来管理你的应用程序的内存. 为了确保在