iOS循环引用问题

平常我们常见的循环引用有block循环引用和对象之间相互强引用两种情况;

1、block循环引用问题:例如

#import "Person.h"

typedef void(^PersonBlock)(NSString *name);

@interface Person()

@property (nonatomic,strong)NSArray *propertyS;

@property (nonatomic,strong)PersonBlock block;

@end

@implementation Person

- (id)init

{

    if (self = [super init]) {

        self.propertyS = @[@"", @"23"];

        self.block = ^(NSString *name){

            NSLog(@"arr:%@", self.propertyS);

        };

    }

    return  self;

}

@end

其中在block中调用propertyS会有警告出现,这是因为在block中调用了self所拥有的东西,引起了循环引用,那么这个循环引用具体怎样引起的呢?
(1)block中引用了self,self被block retain,propertyS又retain了该block的一个拷贝
(2)propertyS是在self中定义赋值的,因此是被self retain的
因此形成了循环引用,不会调用dealloc
解决方法是利用__weak或者__unsafe__unretained去修饰self(在ARC模式下),在MRC模式下用__block修饰


2、两个对象之间相互强引用:

@interface Person : NSObject

{

    Person  *person1;

    Person  *person2;

    NSArray *array;

}

@property (readwrite,assign)Person *person1;

@property (readonly)Person *person2;


@end

person拥有两个Person对象,每个对象又都拥有一个NSArray对象。属性person1和person2都指向了彼此的Person对象。那么两个对象间形成了强引用,ARC将不会销毁这个对象。
为了阻止这种事的发生,声明其中一个属性为弱引用即可(__weak Person *person2)。这样,当person2指向空并且Person对象超出范围时,ARC可以安全的给这个对象发送一个release消息。

__weak指示符既可以声明弱引用,也可以声明空引用。__unsafe_unretained声明弱引用,不是空引用。如果要用后者,那么要自己处理空引用,否则会内存泄漏


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值