iOS复习笔记9:ARC功能

一 ARC简介

ARC是编辑器的一种功能。

它会把alloc出来的对象,自动release。

它把使用retain属性的变量,在dealloc中自动生成release;

在新建项目时选中ARC功能后,不允许调用:

retain

retainCount

release

autorelease

[super dealloc]

二 ARC的判断准则

1 准则:只要没有强指针对象,就会销毁对象

2 指针分两种:

1 强指针: __strong,默认情况下所有的指针都是强指针

2 弱指针: __weak,弱指针指向的对象不存在时会被清空

三 强指针代码示例:

Person* p = [[Person] init];
p = nil;// 清空指针,没有强指针指向内存对象,对象就会释放

或者

p = [[Person] init];// 指针指向了另一个对象,前面分配的内存对象就是释放
Person* person1 = [[Person] init];
Person* person2 = person1;
person1 = nil;
// 函数执行完之后才销毁

弱指针代码示例:

Person* person1 = [[Person] init];
__weak Person person2 = p;
person1 = nil;// 对象销毁

注意如下错误写法:

__weak Person* person1 = [[Person] init];// 会有警告,创建出来的对象会被立马释放

四 property属性参数

1 strong:用于OC对象,成员变量时“强”指针

strong替换retain,不需要在dealloc中release,功能跟retain一样

例如:

@property(nonatomic, strong) Book* book;

2 weak:用于OC对象,成员变量时“弱”指针

strong替换assign,book指向对象销毁时,会被自动清空

@property(nonatomic, weak) Book* book;

3 assign:用于基础数据类型

五 Xcode的ARC转换功能

1 项目转换成ARC

Edit->Refactor->Convert to Object-C ARC,check,next;

然后会出现一个预览,可以看到release,autorelease被删除了,

property的retain变成了strong。

然后点击Save,Enable,就OK啦。

2 兼容非ARC

点击项目->Build Phases:Complie Source,可以看到项目中的源文件,

选中不需要使用ARC的源文件回车,输入:

-fno-objc-arc

这样就可以在该文件中使用非ARC相关的东西了。

3 非ARC项目兼容ARC

在2中输入:

-f-objc-arc

这样在非ARC项目中,就可以兼容ARC文件了。

六 ARC中循环引用

相互持有的对象,将生命周期短的property设置为weak

时间: 2024-10-27 06:37:41

iOS复习笔记9:ARC功能的相关文章

iOS学习笔记之ARC内存管理

iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其所指向对象的所有权 当某个方法(或函数)有一个指向某个对象的局部变量时,可以称该方法(或函数)拥有该变量所指向的对象,如: int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSSt

iOS复习笔记1:HelloWorld项目

2012年10月到2013年5月期间,一直都做iOS开发,后来开始做用cocos做游戏开发. 过去了那么久,复习一下以前学的东西. 一 新建工程 打开Xcode,选择File>Project>Single View Application,然后输入工程名HelloWolrd,选择保存路径. 创建完成之后保存,如图: 二 运行 单击上图左上角的三角形按钮,程序久可是运行了,以下界面一闪而过: 然后出现: 这就是用模拟器运行程序啦:如果闲模拟器太大,看不清楚,可以点击模拟器,然后Window>

iOS复习笔记11:协议和代理

一 功能 可以在协议中声明方法(不能声明变量), 某个类只要遵守这个协议,就相当于拥有协议中所有的方法声明. 父类准守协议,子类也拥有协议中的方法. 协议也可以准守另一个协议. 基协议NSObject(同时也是基类),NSObject基类也准守基协议. 基协议中包含了常用的内存管理方法:release,retain方法等. 二 定义 1 协议定义 @protocal 协议名 <NSObject> // 声明方法 @end 2 遵守协议 2.1 类 @interface 类名 : 父类名 <

iOS复习笔记10:使用Block

功能:保存一段代码,可以在任何时间执行. 标志:^ 跟函数类似: 1 可以保存一段代码 2 有返回值 3 有形参 4 调用方式 变量声明:更函数指针变量类似 返回值类型 (^变量名)(参数类型列表) typedef: 返回值和参数一致的block可以typedef为同一种类型 权限: block内部可以访问外面的变量: 但是,默认情况下,block内部不能修改外面的局部变量: 可以在局部变量加上__block关键字之后,这个变量就可以在block内部修改. 示例: // main.m #impo

iOS复习笔记8:autorelease详解

一 概念 iOS在程序在运行的过程中,会创建很多个释放池,自动释放池以栈的形式存放的(先进后出). 对象调用autorelease时,会被放入栈顶的自动释放池中. 当自动释放池销毁时,会对池的所有对象发送一次release消息: 所以发送autorelease之后引用计数不会立即-1. autorelease返回对象本身. 二 实例 // Person.h @interface Person @property(nonatomic, assign) int age; @end // Person

iOS复习笔记6:property详解

@property type xxx 可以自动生成一个type _xxx;成员变量: 同时还生成对应的setter和getter方法. 可以通过以下四种类型的参数,控制生成getter和setter方法. 1 set方法内存管理参数 1.1 assign: 默认值,直接赋值,使用于基础数据类型 1.2 retain: release旧值,retain新值,再赋值 1.3 copy  : release旧值,copy新值 2 是否要生成setter方法的参数 2.1 readwrite: 默认值,

iOS复习笔记16:应用启动过程和工程结构

一 新建项目 打开Xcode->new->Project->iOS->Single View Application->下一步->输入工程名->下一步->选择路径->create 二 启动过程 1 载入程序到内存 2 在main函数中创建UIApplication 3 创建AppDelegate 4 开始主循环,监听事件 5 创建UIWindow,设置活动窗口 7 加载Info.plist文件,读取主storyboard文件 8 加载storyboar

iOS复习笔记3:类的基本定义

// Car.h // 类的声明 // 类名:Car // 属性:m_nSpeed // 行为:run #import <Foundation/Foundation.h> // NSObject @interface Car : NSObject { // 属性:成员变量(可以是基础类型,枚举,结构体和类对象指针) @public int m_nSpeed;// 默认初始化为0 } // 行为:方法(方法名,返回值,参数) - (void)stop; - (void)run:(int)spee

iOS复习笔记13:常用结构体

都需要包含Foundation.h头文件 CG:CoreGraphics框架简称,CG开头的在Foundation框架中有声明,但是没有实现 NS:NextStep 一 NSRange范围 1 定义: typedef struct _NSRange{ NSUInteger location; NSUInteger length; }NSRange; 2 示例: NSString* str = @"I love OC"; // NSRange* rg = {2, 4}; // NSRan