博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
assign和weak的深层次解析
阅读量:4963 次
发布时间:2019-06-12

本文共 854 字,大约阅读时间需要 2 分钟。

我们知道在设置类的属性时,控件一般中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
*)touches withEvent:(UIEvent *)event { NSLog(@"%@",NSStringFromCGRect(_redView.frame)); }

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

原因分析

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

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

 
 

转载于:https://www.cnblogs.com/mengfei90/p/5129884.html

你可能感兴趣的文章
网易游戏——两年测试工作体会
查看>>
docker知识点
查看>>
精灵图的使用
查看>>
silverlight子窗体操作数据库后刷新父窗体
查看>>
在vmware上安装kali系统
查看>>
Jmeter 基本介绍
查看>>
java实现栈
查看>>
JavaScript
查看>>
spring的controller默认是单例还是多例
查看>>
ROI
查看>>
PostgreSQL学习手册
查看>>
课后习题
查看>>
[题解]Yet Another Subarray Problem-DP 、思维(codeforces 1197D)
查看>>
RecyclerView下拉加载集合越界问题
查看>>
Trunk 实现跨交换机 VLAN 通信
查看>>
吴恩达教你如何学习机器学习
查看>>
常用的PCB库文件
查看>>
Javascript模块化编程 require.js使用详解
查看>>
快速幂学习入门
查看>>
ubuntu 刚更改默认python3版本后更新包等
查看>>