zoukankan      html  css  js  c++  java
  • assign和weak的深层次解析

    我们知道在设置类的属性时,控件一般中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。

     
     
  • 相关阅读:
    函数嵌套 lisp表达式求值
    初涉时间间隔问题
    高精度算法-带小数大数相加
    12/10 C语言程序设计竞赛 后五题
    字符串头尾连接问题-木棒连接
    ZJGSU-ACM OJ 心得
    高精度算法-大数乘法
    趣味两题-(简单追及问题、两直线相交问题)
    struts2基于注解的action
    spring中常用的注解
  • 原文地址:https://www.cnblogs.com/mengfei90/p/5129884.html
Copyright © 2011-2022 走看看