博客> 代理为什么用weak最标准
代理为什么用weak最标准
2019-12-07 19:51 评论:0 阅读:767 阮延超
快捷键 仓库

在开发中,我们常常会遇到创建代理的属性,而约定俗成的用法就是设成weak,很多同学知道这么用,但是不知道为什么不能用strong ,不用assign,copy;今天我想简单说一下原因。 weak的用法想必大家都很熟悉了,弱引用,在无强应用的情况下,对象就会被释放。 而strong,copy都是强应用,retaincount+1

举个例子说明一下 SPDog类 SPDog.h:

@protocol SPDogDelegate @end

@interface SPDog : NSObject

@property (nonatomic, weak) iddelegate;

@end

SPPerson.m:

import "SPDog.h"

@implementation SPDog

  • (void)dealloc { NSLog(@"SPDog----销毁"); }

@end SPPerson类 SPPerson.h:

@interface SPPerson : NSObject

@end SPPerson.m:

import "SPPerson.h"

import "SPDog.h"

@interface SPPerson() /* 强引用dog/ @property (nonatomic, strong) SPDog *dog; @end

@implementation SPPerson

  • (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(@"SPPerson----销毁"); }

@end 在ViewController实现:

import "ViewController.h"

import "SPPerson.h"

@interface ViewController () @end

@implementation ViewController

  • (void)viewDidLoad { [super viewDidLoad]; // 实例化person, self对person弱引用,person的retainCount不变 HSPerson *person = [[SPPerson alloc] init];

} @end

分析:  20150814154541526.png

person对dog强引用,dog.delegate对person强引用,person的retainCount为1,所以person不会释放,dog固然也不会释放,这就是造成循环引用的导致内存泄露的原因!

如果用weak  20150814161819593.png 一旦person释放,dog也会被释放了

而copy也有同样的问题,同样也是强引用。而assign是专门给基础数据类型用的,虽然功能类似,但是对象一般使用weak。

收藏
0
sina weixin mail 回到顶部