什么情况使用 weak 关键字,相比 assign 有什么不同?
2020-04-16 本文已影响0人
携YOU手同行
1.在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性。
2.自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用strong。
IBOutlet连出来的视图属性为什么可以被设置成weak?
因为父控件的subViews数组已经对它有一个强引用。
不同点:
assign 可以用非 OC 对象,而 weak 必须用于 OC 对象。
weak 表明该属性定义了一种“非拥有关系”。在属性所指的对象销毁时,属性值会自动清空(nil)。
例如
@property (assign, nonatomic) NSMutableArray *infoArray;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_infoArray = [[NSMutableArray alloc]init];
[_infoArray addObject:@"1"];
NSLog(@"相关修饰符的做 %@",_infoArray);
}
利用assign修饰数组对象,也可以进行增加和删除操作,打印日志如下
2020-04-16 16:37:39.585598+0800 内存管理[5152:240318] 相关修饰符的做 (
1
)
但是如果用weak去修饰一个非oc对象,就会报错
图片.png