读书笔记之_weak修饰词

二、 _weak修饰词
因为使用_strong修饰词,易出现循环引用,使用_weak来解决。

这里写图片描述

(1)循环引用的例子--在类中成员变量可能出现的循环引用
@interface Test : NSObject { 
id _strong obj;
}
(void)setObject:(id __strong)obj;
@end

@implementation Test
- (id)init
{
self = [super init];
return self;
}

(void)setObject:(id __strong)obj {
obj_ = obj;
}
@end
下面这段代码将产生循环引用
{
id test0 = [[Test alloc] init];//test0对对象A有强引用,[[Test alloc] init]为对象A
id test1 = [[Test alloc] init];//test1对对象B有强引用,[[Test alloc] init]为对象B
[test0 setObject:test1]; //对象A的成员变量obj_对对象B有强引用,此时对象A的的成员变量以及test1对对象B有有强引用。
[test1 setObject:test0]; // 对象B的成员变量obj_及test0对对象A有强引用。
}

控制流出了这段代码区域时,变量test0对A的强引用消失,对象A被自动释放。类似的对象B也被自动释放。但是对象A的成员变量obj_ 还强引用对象B,从而内存泄漏

这里写图片描述

解决方法

@interface Test : NSObject {
id _weak obj;
}
-(void)setObject:(id __strong)obj;
@end

这里写图片描述

(2)self reference造成的循环引用

什么是’self reference’
对象对自己的引用简称’self reference’
例子
id test = [[Test alloc] init];
[test setObject:test];

这里写图片描述

避免’self reference’--使用_weak属性修饰词
_weak修饰词提供一个弱引用,使用_weak可以避免循环引用。
id _weak obj = [[NSObject alloc] init];
上面代码编译后会出现警告:warning: assigning retained obj to weak variable; obj will be released after assignment [-Warc-unsafe-retained-assign]

{
 id __strong obj0 = [[NSObject alloc] init]; //变量obj0被_strong修饰,拥有[[NSObject alloc] init]的对象所有权
id __weak obj1 = obj0; //obj1对[[NSObject alloc] init]有一个弱引用
}
//离开此区域,对象的强引用消失,对象被自动释放。因为弱引用对对象没有拥有权。

 当一个被weak修饰的变量对一个对象有一个引用,并且这个对象消失时,这个弱引用也就自动消失。这意味着变量被分配为nil。

id __weak obj1 = nil; {
id __strong obj0 = [[NSObject alloc] init];
obj1 = obj0;
NSLog(@”A: %@”, obj1); }
NSLog(@”B: %@”, obj1);
The result is:
A:
B: (null)

(3)什么是内存泄漏
内存泄漏指一些被认为释放的对象仍保留在内存中,循环引用常造成内存泄漏

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员的修养

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值