ARC机制介绍及使用

ARC简介

1.指针分类
1)强指针:__strong关键字修饰的指针。默认情况下,所有指针都是强指针,
2)弱指针:__weak关键字修饰的指针
声明一个弱指针:__weak Person * p;//weak前是两个下划线
2.ARC的概念
Automatic Reference Counting,自动引用计数,即ARC
在ARC模式下,只需要像往常一样编写代码,只不过永远不写retain,release和autorelease这三个关键字,因为编译器会自动在代码的合适位置插入retain,release和autorelease。
3.ARC判断准则
只要没有强指针指向的对象,对象就会被释放
注意:当使用ARC的时候,暂时忘记”引用计数器”,因为判断标准变了,这时候的retainCount是一个很大的数值

ARC机制下指针的指向问题

//main.m

#import <Foundation/Foundation.h>
int main(int argc, const char *argv[]){
    @autoreleasepool{
        NSString *a = @"One"; // 这时,强指针a指向了对象@"One"
        NSString *b = @"One"; //这时,强指针b也指向了对象@"One";
        a = @"Two";//当a指向对象@"Two"时,对象@"One"并不会被销毁,因为还有一个b指向它。
        b = @"Two";//此时,已经没有指针指向@"One"了,该对象就被销毁了。
    }
    return 0;
}
//main.m

#import <Foundation/Foundation.h>
int main(int argc, const char *argv[]){
    @autoreleasepool{

        NSString *a = @"One"; // 这时,强指针a指向了对象@"One"

        __weak NSString *b = @"One"; //这时,强指针b也指向了对象@"One";
        a = @"Two";//当a指向对象@"Two"时,对象@"One"只有一个弱指针b指向它,此时,@"One"将会被销毁,b被赋值为nil;

    }
    return 0;
}

ARC机制判断

ARC机制下的几个明显标志:
1)不允许调用对象的release方法
2)不允许调用autorelease方法
3)再重写父类的dealloc方法时,不能再调用[super dealloc];

ARC下对象内存管理

1.单对象内存管理

//main.m

#import <Foundation/Foundation.h>
int main(int argc, const char *argv[]){
    @autoreleasepool{
        //创建一个对象
        Person * p = [[Person alloc] init]; //假设有一个Person类,该类含有一个-(void)eat;方法
        p = nil; //此处执行完毕后,p对象被回收。因为p指针想象的内存没有指针指向了,所以原来的内存被回收了。
        [p eat]; //此处不会报错
        //因为[nil eat];不会错误。
    }
    return 0;
}

2.多对象循环引用问题
有两个类,每个类中都有一个指针指向对方。
这时,这两个指针应该一个设为 __strong,一个设为 __weak,这样就避免了两个强指针引用而导致内存泄露的问题

ARC下@property参数

ARC中的@property
strong:用于OC对象,相当于MRC中的retain
weak:用于OC对象,相当于MRC中的assign
assign:用于基本数据类型,跟MRC中的assign一样
copy:一般用于NSString, 跟MRC中的copy一样
在ARC情况下解决“循环retain”的问题:@property一边用strong,一边用weak

ARC的兼容和转换

1.ARC模式下兼容非ARC的类
让程序兼容ARC和非ARC部分。
转变为MRC -fno-objc-arc
转变为ARC的 -f-objc-arc
字符串是特殊的对象,但不需要使用release手动释放,这种字符串对象默认就是autorelease的,不用额外的去管内存
2.将MRC转换为ARC
如果一个项目是MRC的,那么我们可以把这个项目转换为ARC的
通过Xcode菜单Edit->Refactor->Convert to Objective-C ARC…选择要转换的Target,点击enable。

总结:

ARC下有强指针,弱指针
ARC下不能使用retain,release,autorelease和[super dealloc]方法.而且retainCount是一个极大的数值
注意ARC下的多对象引用问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值