在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;
}
如果像程序中写的那样把Kity的person属性改为weak之后,在程序运行后helloKitty没有一个强指针指向它,因此率先被释放,从而Nick也被释放。
可以把_strong和_weak抽象化理解一下,如果把一个风筝看做对象的话,那么_strong就是拴着风筝的线,_weak就是看着风筝的人,一旦拴着风筝的线为0,风筝就会飞走,此时无论看着风筝的人有多少,风筝飞走之后看着风筝的人也都归0。