【ARC机制下单个对象的内存管理 Objective-C语言】

本文探讨了ARC环境下对象内存管理,重点讲解了强指针与弱指针的作用,何时对象会被回收,以及如何通过__strong和__weak声明。实例分析了强指针释放后弱指针行为和对象回收标准。

前言

1)ARC下的单个对象的内存管理
在ARC的机制下,当1个对象没有任何的强指针指向它的时候,这个对象就会被立即回收。
什么时候1个对象就没有强指针指向它了呢?
例如:有一个Person类
@interface Person : NSObject
@end

@implementation Person
– (void)dealloc
{
NSLog(@“人挂了。。。”);
}
@end

#import <Foundation/Foundation.h>
#import “Person.h”
int main()
{
if(1)
{
Person *p1 = [Person new];
__weak Person *p2 = p1 ;
}
return 0;
在if语句的大括弧结束的时候,强指针p1和弱指针p2就都被销毁了,没有强指针指向Person对象了,Person对象就被销毁了。
2)在例如:
int main()
{
__weak Person *p2 = nil;
if(1)
{
Person *p1 = [ Person new];
p2 = p1;
}
return 0;
}
if语句的大括弧结束的时候,强指针p1被销毁了,弱指针p2还没被销毁,Person对象没有强指针指向它了,也就被销毁了。。。

一、什么叫没有任何强指针指向对象?

1、当指向对象的所有的强指针被回收的时候,对象就会被立即回收。。。

2、将所有指向对象的强指针赋值为nil的时候,对象就会被立即回收。。。

这两种情况,就叫没有任何强指针指向对象

1)指向对象的所有强指针,被回收掉了。。。
2)指向对象的所有强指针,赋值为nil
例如:Person *p1 = [Person new];
Person *p2 = [Person new];
__weak Person *p3 = p2;
p1 = p2 = nil;
这个时候,对象也会被回收。。。

二、详细说明强指针和弱指针。。。

1.强指针和弱指针的声明

1)默认情况下,所有的指针都是强指针。也就是说,我们之前声明的指针变量都是强类型的。
p1指针是强类型的,因为默认情况下,指针都是强类型的。
Person *p1 = [[Person alloc] init];

2.不过,我们可以使用__strong来显示的标识指针是强类型的指针

__strong Person *p2 = [Person new];
这个时候p2指针类型是强指针类型的,其实写不写__strong都是强类型的指针。

3.指针类型也可以是弱指针类型,使用__weak标识的指针类型是弱指针类型

__weak Person *p3 = p2;
这个时候,p3指针就是1个弱类型的指针,p3弱指针也指向p2指针指向的对象。

4.在操作对象的时候,通过强指针或者弱指针都可以操作,没有任何区别

三、ARC模式下对象的回收标准

1.ARC机制下释放一个对象的标准是:没有任何强指针指向对象的时候,对象就会被释放,如果这个时候有弱指针指向呢,也会被释放。

2.最重要的1点:如果创建对象的时候,用1个弱指针存储这个对象的地址,那样一旦创建出来,这个对象就会被立即回收

例如:__weak Person *p1 = [[ Person alloc ] init ];
这个时候,p1指针指向的Person对象,刚创建出来,就会被回收。

3. 例如:Person类有一个sayHi方法

– (void)sayHi
{
NSLog(@“大家好,我是人。。。”);
}

int main()
{
Person *p1 = [ Person new];
__weak Person *p2 = p1;
p1 = nil;
[p2 sayHi];
}
[p2 sayHi];这句话,会报僵尸对象错误。。。,但是,为什么没有报僵尸对象错误呢,请看下面:

4. 在ARC的机制下,当对象被回收的时候,原来指向这个对象的弱指针,会被自动设置为nil

所以,上面这句话[p2 sayHi];不会报错,因为现在p2这个弱指针被自动设置为nil了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风清晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值