strong和weak的区别

在ARC环境下,_strong和_weak都可以作为@property的属性

 

其中_strong表示强引用,是ARC条件下实例变量的默认属性;

_weak表示弱引用,是ARC条件下为了避免两个强引用变量相互引用造成死循环而定义的属性。

 

如果一个对象没有任何强类型的指针指向它,它就会被释放,这时即便有弱指针指向它,该弱指针也会被置为nil;因此我们在创建对象的时候,不能仅仅用1个弱指针来储存创建出来的对象,因为只有一个弱指针指向该对象的话,该对象刚创建出来就被回收了。

weak和assign的区别是:weak当指向的内存释放掉后自动nil化,防止野指针


_weak作为弱指针的作用就是防止循环引用出现内存泄露,请看如下例子:

假设有一个Person类,包含一个风筝属性kite;

#import <Foundation/Foundation.h>

#import "HITKite.h"

@interface HITPerson : NSObject

@property(nonatomic,strong)HITKite *kite;

@end


又有一个风筝类包含一个owner属性;

#import <Foundation/Foundation.h>

@class HITPerson;

@interface HITKite : NSObject

@property(nonatomic,weak)HITPerson *person;

@end


在main.m中

#import <Foundation/Foundation.h>

#import "HITPerson.h"

int main(int argc,constchar * argv[]) {

    @autoreleasepool {

    HITPerson *Nick = [[HITPersonalloc]init];

    HITKite *helloKitty = [[HITKitealloc]init];

    Nick.kite = helloKitty;

    helloKitty.person = Nick;

    }

    return 0;

}


创建了一个名为Nick的person和一个名字为helloKitty的kite,使得Nick的kite属性为 helloKitty,同时也让helloKitty的person属性为Nick。这种情况下,如果在定义属性时,把Person类中的kite属性与Kite类中的person属性都定义成strong,就会发生内存泄露。按照规则,如果想要释放Nick要先释放helloKitty,而同样要释放helloKitty就要先释放Nick,二者相互等待对方先释放,就造成了循环引用从而出现了内存泄露。


如果像程序中写的那样把Kity的person属性改为weak之后,在程序运行后helloKitty没有一个强指针指向它,因此率先被释放,从而Nick也被释放。


可以把_strong和_weak抽象化理解一下,如果把一个风筝看做对象的话,那么_strong就是拴着风筝的线,_weak就是看着风筝的人,一旦拴着风筝的线为0,风筝就会飞走,此时无论看着风筝的人有多少,风筝飞走之后看着风筝的人也都归0。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值