码迷,mamicode.com
首页 > 移动开发 > 详细

从一个弱引用导致的奔溃 谈 weak assign strong的应用场景【iOS开发教程】

时间:2015-05-26 06:43:09      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:

从一个弱引用导致的奔溃 谈 weak assign strong的应用场景

.h中的定义方法一:

 @property (nonatomic, assign) NSArray *dataSource; 

定义方法二

 @property (nonatomic, strong) NSArray *dataSource;

.m中的实现方法

- (void)viewDidLoad {
    [super viewDidLoad];
    if (YES) {
        NSArray *array = @[@"1", @"2", @"3"];
        self.dataSource = array;
    } 
    if (self.dataSource.count > 2) {
        NSLog(@"self.dataSource 是否能打印?能打印说明可以定义为assign");
    }
}

结果。h中方法?崩溃了,方法?可以执行,

但是如果还是用方法?该如何,解决呢?

- (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变量,指向的是同一块儿内存区域。

同时也可以看出,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];
    }
}

从一个弱引用导致的奔溃 谈 weak assign strong的应用场景【iOS开发教程】

标签:

原文地址:http://www.cnblogs.com/ChenYilong/p/4529463.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!