從一個弱引用致使的奔潰 談 weak assign strong的應用場景【iOS開發教程】

.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];
    }
}
相關文章
相關標籤/搜索