assign vs weak

ARC下assign和weak区别

assign 和 weak 非常相像,都不对引用计数加1。assign其实也可以修饰对象,但一般不这么做,为什么呢? 下面介绍下两者区别。
这两者主要区别就是weak比assign多了一个功能。当weak修饰的property指向的对象被释放时,该property会自动被置为nil,这样给该property发送任何消息都不会报错。而assign修饰的property指向的对象如果被释放,该property并不会自动被置为nil,这时如果该property指向的内存里结构发生变化,然后又向该property发送消息,那么就会造成野指针操作,导致app崩溃。

还是举个例子解释下。(代码来源网上)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//
// ViewController.m
// weak与assgin的区别
//
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic,weak) id weakPoint;
@property (nonatomic,assign) id assignPoint;
@property (nonatomic,strong) id strongPoint;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.strongPoint = [NSDate date];
NSLog(@"strong属性:%@",self.strongPoint);
self.weakPoint = self.strongPoint;
self.assignPoint = self.strongPoint;
self.strongPoint = nil;
NSLog(@"weak属性:%@",self.weakPoint);
// NSLog(@"assign属性:%@",self.assignPoint);
}
@end

上面代码注释打开后,运行程序有时会崩溃(assignPoint指向的内存结构已经发生变化),有时不会(assignPoint指向的内存结构还没发生变化)。

总结

  • 修饰基础数据结构时用assign
  • 修饰弱引用的指针还是用weak

PS:
IOS开发中ARC下的assign和weak区别
What’s the difference between ‘weak’ and ‘assign’ in delegate property declaration