.h中的定义方法一:atom
@property (nonatomic, assign) NSArray *dataSource;
定义方法二spa
@property (nonatomic, strong) NSArray *dataSource;
.m中的实现方法code
- (void)viewDidLoad { [super viewDidLoad]; if (YES) { NSArray *array = @[@"1", @"2", @"3"]; self.dataSource = array; } if (self.dataSource.count > 2) { NSLog(@"self.dataSource 是否能打印?能打印说明能够定义为assign"); } }
结果。h中方法⓵崩溃了,方法⓶能够执行,内存
可是若是仍是用方法⓵该如何,解决呢?get
- (void)viewDidLoad { [super viewDidLoad]; if (YES) { NSArray *array = @[@"1", @"2", @"3"]; self.dataSource = [array copy]; } if (self.dataSource.count > 2) { NSLog(@"self.dataSource 是否能打印?能打印说明能够定义为assign"); } }
或者编译器
- (void)viewDidLoad { [super viewDidLoad]; if (YES) { NSArray *array = @[@"1", @"2", @"3"]; self.dataSource = [NSArray arrayWithArray:array]; } if (self.dataSource.count > 2) { NSLog(@"self.dataSource 是否能打印?能打印说明能够定义为assign"); } }
总之,这两种改进方案,和strong一个道理,strong是在setter中,就对等号右边的值进行了strong操做, 那为何把上面的self.dataSource改为_dataSource一样不会引发崩溃呢? _dataSource 编译器自动生成了setter方法,并生成了_dataSource 这个iVar变量,指向的是同一起内存区域。it
同时也能够看出,strong也影响到了_dataSource的赋值。看下MRC会更直观:编译
ARC的setter变量
// _age的setter和getter - (void)setAge:(int)age { _age = age; }
MRC的setter方法
//@property (nonatomic, retain) NSString *name; - (void)setName:(NSString *)name { if (_name != name) { [_name release]; _name = [name retain]; } }
//@property(nonatomic, copy) NSString *name; - (void)setName:(NSString *)name { if (_name != name) { [_name release]; _name = [name copy]; } }