.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]; } }