进击的KFC : View使用strong还是weak
来源:互联网 发布:js只选择小时分钟控件 编辑:程序博客网 时间:2024/06/05 02:42
懒加载写法:
@interface ViewController ()@property (nonatomic, weak) UIView *weakView;@property (nonatomic, strong) UIView *strongView;@end@implementation ViewController/** UI控件使用弱引用创建方法 1. UIView *weakView = [[UIView alloc] init]; 这句必须声明一个局部变量, 不能用_weakView, 因为用 _weakView = [[UIView alloc] init], 等号右侧创建了一个View之后,给了一个弱引用持有,相当于没有持有,直接就释放掉了 而 UIView *weakView = [[UIView alloc] init],等号左侧的weakView默认是一个强引用,会暂时持有保住它,但是生命周期就在这个懒加载的大括号内,所有会有其他代码配合, 使这个View存活下来, 不被释放 2. _weakView = weakView; 这句代码为属性赋值, 以后在其他位置不管通过self.weakView还是_weakView才能找到这个View, 基本作用可以说等同于强引用的 _strongView = [[UIView alloc] init]; 3. [self.view addSubview:weakView], 第一条注释中说了,UIView *weakView 的生命周期就是在这个{}内,那么如何保证出了括号依旧存在,就是要给这个View加到一个不会被释放的View(不一定强引用弱引用)上,即self.view, 这样就不会被释放掉了 */- (UIView *)weakView { if (!_weakView) { UIView *weakView = [[UIView alloc] init]; _weakView = weakView; weakView.backgroundColor = [UIColor redColor]; [self.view addSubview:weakView]; } return _weakView;}- (UIView *)strongView { if (!_strongView) { _strongView = [[UIView alloc] init]; _strongView.backgroundColor = [UIColor greenColor]; } return _strongView;
布局时区别:
- (void)configView { WeakSelf(ws); //弱引用由于懒加载直接加到父视图上,所以点语法完了直接调用masonry布局方法即可 [self.weakView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(ws.view); make.top.equalTo(ws.view).offset(100); make.size.mas_equalTo(CGSizeMake(100, 100)); }]; [self.view addSubview:self.strongView]; [self.strongView mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(ws.view); make.bottom.equalTo(ws.view).offset(-100); make.size.mas_equalTo(CGSizeMake(100, 100)); }];}
移除之后的区别(重点,涉及到理解强弱指针):执行上述代码后,屏幕上出现一上一下两个View, 点击空白区域, 移除掉两个View, 1秒后看一下,1秒后看是因为, 出了这个方法, 也就是运行到结束的括号之后, 才会把View移除掉, 注意看坐下控制台两个View,weakView为nil, 即已被释放, strongView还是存在, 因为即使从父视图上移除, self本身对其还有一个强引用, 不会释放掉,那么如果想把这个View释放掉需要怎么办, 就是在[_strongView removeFromSuperview]后面加一句_strongView = nil;
下面图解一下, 为什么不置空, strongView就不被释放
总结起来的话, 其实如果理解到位,使用强弱都没有问题,但是一般来说,由于弱引用会被及时的释放掉,所以需求允许的话,一般建议使用弱引用,那什么情况不能使用弱引用呢,这个要看具体需求,举个例子,如果一个View,需要从父View移除掉,但是之后还有可能加回来,还要保持移除之前的样子,这种情况强引用会更适合。
0 0
- 进击的KFC : View使用strong还是weak
- 进击的KFC:NSURLSession的使用
- iOS 面试题(6.):自己写的 view 成员,应该用 weak 还是 strong?
- 进击的KFC:懒加载
- 进击的KFC:链式编程
- 关于一些UI的property应该使用retain、strong还是weak的问题
- iOS中代码创建UIView的时候,使用weak还是strong?
- 进击的KFC:UI(四)实现划屏效果,用View实现Button的效果
- IBOutlet对象应该使用strong还是weak修饰
- ios weak和strong使用的区别
- iOS开发 strong和weak的使用
- 进击的KFC:OC(六)Block
- 进击的KFC:UI(十一)自定义Cell
- 进击 的KFC:UI(12)动画
- 进击的KFC:UI(13)多线程
- 进击的KFC: translucent 和 automaticallyAdjustsScrollViewInsets
- 进击的KFC:OC(四)NSString、NSArray、NSNumber、使用苹果帮助文档、值对象
- 进击的KFC:在同一个Xib内创建多个UITableViewCell来方便使用
- 309. Best Time to Buy and Sell Stock with Cooldown
- 腾讯企业邮发送邮件 java版
- 最全的常用正则表达式大全
- javaweb中乱码问题
- 矩阵快速幂-- 挑战程序设计
- 进击的KFC : View使用strong还是weak
- HDU-1599-find the mincost route
- PHP中的ob_start()等函数
- android M Launcher之LauncherModel (三)
- NOIP2016备赛试题
- 数据结构——树的水平遍历
- python数据结构学习笔记-2016-11-26-01-链表排序
- 线程管理之---信号量的操作
- java 堆栈