iOS 代理为啥要用weak修饰? (刨根问底一)
来源:互联网 发布:冰雪大世界 知乎 编辑:程序博客网 时间:2024/04/29 09:40
转载地址: http://www.jianshu.com/p/398472616435
iOS 代理为啥要用weak修饰? (刨根问底一)
在开发中我们经常使用代理,或自己写个代理,而代理属性都用weak(assign)修饰,看过有些开发者用strong(retain),但并没发现有何不妥,也不清楚weak(assign)与strong(retain)修饰有何区别
功能实现就行了,考虑这么多干嘛~~~我只能哈哈哈
weak
:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制
@property (nonatomic, weak) id<HSDogDelegate>delegate;
strong
:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用(Retain Cycles)
@property (nonatomic, strong) id<HSDogDelegate>delegate;
可能你还不太理解,没关系,下面先举例,看结果,再分析!
举例
HSDog类
HSDog.h
:
@protocol HSDogDelegate <NSObject>@end@interface HSDog : NSObject@property (nonatomic, weak) id<HSDogDelegate>delegate;@end
HSPerson.m
:
#import "HSDog.h"@implementation HSDog- (void)dealloc{ NSLog(@"HSDog----销毁");}@end
HSPerson类
HSPerson.h
:
@interface HSPerson : NSObject@end
HSPerson.m
:
#import "HSPerson.h"#import "HSDog.h"@interface HSPerson()<HSDogDelegate>/** 强引用dog*/@property (nonatomic, strong) HSDog *dog;@end@implementation HSPerson- (instancetype)init{ self = [super init]; if (self) { // 实例化dog self.dog = [[HSDog alloc] init]; // dog的delegate引用self,self的retainCount,取决于delegate修饰,weak:retainCount不变,strong:retainCount + 1 self.dog.delegate = self; } return self;}- (void)dealloc{ NSLog(@"HSPerson----销毁");}@end
在ViewController实现
:
#import "ViewController.h"#import "HSPerson.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // 实例化person, self对person弱引用,person的retainCount不变 HSPerson *person = [[HSPerson alloc] init];}@end
结果
:
weak修饰代理
@property (nonatomic, weak) id<HSDogDelegate>delegate;
运行->打印
:
HSPerson----销毁HSDog----销毁
strong修饰代理
@property (nonatomic, strong) id<HSDogDelegate>delegate;
运行->打印
:....并未打印,说明HSPerson、HSDog对象没调用dealloc方法,两个对象未销毁
这也是我们经常说的内存泄露,该释放的内存并未释放!
分析
:
使用strong
person对dog强引用
@property (nonatomic, strong) HSDog *dog; person
self.dog.delegate又对person强引用,使person的retainCount + 1
@property (nonatomic, strong) id<HSDogDelegate>delegate;
当viewController不对person引用后,dog.delegate对person还强引用着,person的retainCount为1,所以person不会释放,dog固然也不会释放,这就是造成循环引用的导致内存泄露的原因!
- 使用weak
person对dog强引用
@property (nonatomic, strong) HSDog *dog; person
self.dog.delegate只对person弱引用,并未使person的retainCount + 1
@property (nonatomic, weak) id<HSDogDelegate>delegate;
所以当viewController不对person引用后,person的retainCount为0,即person会被释放,那么dog也被释放
0 0
- iOS 代理为啥要用weak修饰? (刨根问底一)
- iOS 代理为啥要用weak修饰? (刨根问底一)
- iOS 代理为啥要用weak修饰? (刨根问底一)
- iOS中assign,copy,retain之间的区别以及weak和strong的区别 代理为啥要用weak修饰
- iOS中代理属性为什么要用Weak修饰?
- iOS 为什么要用weak修饰代理(delegate)
- iOS中代理属性为什么要用Weak修饰?
- iOS中代理属性为什么要用Weak修饰?
- iOS中代理属性为什么要用Weak修饰?
- iOS中代理属性用Weak修饰
- 代理属性为何要用 weak 修饰?
- iOS内存管理(3)-- iOS 代理要用weak修饰
- iOS 关于修饰代理用weak还是assign, strong
- iOS 关于修饰代理用weak还是assign
- iOS开发-修饰代理delegate用weak还是assign?
- 关于ARC下修饰代理用assign还是weak
- IOS:代理delegate为什么要用assign或者weak
- iOS 内存优化 代理--weak
- 【高性能】Lustre分布式存储文件系统介绍和故障分析
- Hibernate学习——(一)简介、配置以及Annotation介绍
- Codeforces Round #343 (Div. 2) C. Famil Door and Brackets(DP)
- httpclient 3上传文件例子
- BIT2014级软件学院程序设计-06贪婪的你
- iOS 代理为啥要用weak修饰? (刨根问底一)
- win10设置自动更新
- java 父类的作用
- CoreAnimation 动画总结
- 信息学奥林匹克竞赛-C语言数据类型
- linux安装mysql总结
- Android 计时器
- FFmpeg解析视频保存为yuv
- 搭建Maven环境