码迷,mamicode.com
首页 > 其他好文 > 详细

assign和weak的深层次解析

时间:2016-01-14 14:01:10      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

我们知道在设置类的属性时,控件一般中weak,对象一般用strong,数据类型一般使用assign,其中weak和assign都不会使计数器增加,那为什对象不可以使用assign呢?

weak与assignd的区别:

weak:弱指针,不会让引用计数器+1,当其指向的对象被销毁时,这个弱指针会被清空,nil
assign:不会使引用计数器+1,但对象被销毁时,指针不会清空,若用它来修饰对象,有可能会产生野指针。
@property (nonatomic, assign) UIView *redView;

- (void)viewDidLoad {
    [super viewDidLoad];

    UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    redView.backgroundColor = [UIColor redColor];
//    [self.view addSubview:redView];
    _redView = redView;
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"%@",NSStringFromCGRect(_redView.frame));
}

上面的代码在执行过程中,点击屏幕会程序会崩毁。

原因分析

代码中的redView对象在viewDidLoad方法执行完时,因为没有强指针引用,就会被释放,点击屏幕,就会造成程序崩毁,因为此时的_redView已经是野指针了。

如果redView对象使用weak修饰时,便不会出现野指针的情况,因为_redView在指向的对象redView被销毁时,系统会自动将其设为nil。

 
 

assign和weak的深层次解析

标签:

原文地址:http://www.cnblogs.com/mengfei90/p/5129884.html

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