oc循环引用问题

gx_wqm 2016-06-11 12:51:20
遇到一个问题:
这样写会导致循环引用,好理解:
self.block = ^{
NSLog(@"%@", self.ob1);
};
但是这样就obj1能正常释放了,理解不了:
BlockOb *tempOb = self.ob1;

self.block = ^{
NSLog(@"%@", tempOb);
};

谁帮忙解析一下!(BlockOb是继承NSobject,仅重写了dealloc, ob1时BlockOb对象)
...全文
487 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Immanito 2016-07-25
  • 打赏
  • 举报
回复
引用 13 楼 disburden 的回复:
[quote=引用 12 楼 a547720714 的回复:] [quote=引用 11 楼 disburden 的回复:] [quote=引用 9 楼 a547720714 的回复:] [quote=引用 1 楼 disburden 的回复:] 我估计导致循环应用的并不是BlockOb,而是self __weak selfClass *wself=self; self.block = ^{ NSLog(@"%@", wself.ob1); }; 这样应该就不会了
版主,我为什么不能编辑帖子。。。。。[/quote] 这个坛子就是这么设计的,我也无能为力[/quote] 是因为我的级别不够,还是说谁都不能编辑?[/quote] 应该只有版主才能编辑,其他人都不能编辑,我也不知道为什么这么设定,可能是想让大家发贴的时候注意点吧,搞不懂,有不少人都有疑问[/quote] 哦哦,那知道了,确实设计的很不合理啊,难免有笔误的时候,改贴应该是最基本的功能了啊。。。。。谢谢
不担心 2016-07-25
  • 打赏
  • 举报
回复
引用 12 楼 a547720714 的回复:
[quote=引用 11 楼 disburden 的回复:] [quote=引用 9 楼 a547720714 的回复:] [quote=引用 1 楼 disburden 的回复:] 我估计导致循环应用的并不是BlockOb,而是self __weak selfClass *wself=self; self.block = ^{ NSLog(@"%@", wself.ob1); }; 这样应该就不会了
版主,我为什么不能编辑帖子。。。。。[/quote] 这个坛子就是这么设计的,我也无能为力[/quote] 是因为我的级别不够,还是说谁都不能编辑?[/quote] 应该只有版主才能编辑,其他人都不能编辑,我也不知道为什么这么设定,可能是想让大家发贴的时候注意点吧,搞不懂,有不少人都有疑问
Immanito 2016-07-25
  • 打赏
  • 举报
回复
引用 11 楼 disburden 的回复:
[quote=引用 9 楼 a547720714 的回复:] [quote=引用 1 楼 disburden 的回复:] 我估计导致循环应用的并不是BlockOb,而是self __weak selfClass *wself=self; self.block = ^{ NSLog(@"%@", wself.ob1); }; 这样应该就不会了
版主,我为什么不能编辑帖子。。。。。[/quote] 这个坛子就是这么设计的,我也无能为力[/quote] 是因为我的级别不够,还是说谁都不能编辑?
不担心 2016-07-24
  • 打赏
  • 举报
回复
引用 9 楼 a547720714 的回复:
[quote=引用 1 楼 disburden 的回复:] 我估计导致循环应用的并不是BlockOb,而是self __weak selfClass *wself=self; self.block = ^{ NSLog(@"%@", wself.ob1); }; 这样应该就不会了
版主,我为什么不能编辑帖子。。。。。[/quote] 这个坛子就是这么设计的,我也无能为力
weiyunmis 2016-07-23
  • 打赏
  • 举报
回复
Immanito 2016-07-22
  • 打赏
  • 举报
回复
引用 1 楼 disburden 的回复:
我估计导致循环应用的并不是BlockOb,而是self __weak selfClass *wself=self; self.block = ^{ NSLog(@"%@", wself.ob1); }; 这样应该就不会了
版主,我为什么不能编辑帖子。。。。。
Immanito 2016-07-22
  • 打赏
  • 举报
回复
不好意思 改写的时候写错了,应该是这样
NSLog(@"%@", innerSelf.ob1);
Immanito 2016-07-22
  • 打赏
  • 举报
回复
没有在block块内部声明的变量对于block来说都叫做外部变量,对于外部变量,如果是常量,在运行block块的时候会直接将值拷贝过来,如果是对象,block会使用强引用直接捕获这个对象,即拥有了这个对象。

self.block = ^{
        NSLog(@"%@", self.ob1);
};
这段代码,编译器会将代码块中的self.ob1看作是self->ob1,block会捕获你的self而不是ob1,这个是规则。 你自身就拥有这个block作为实例变量,又在这个block中强引用self,自然就是强引用循环了。 要想改写的话,楼上说的不全面,不仅要在block外改变self为弱引用,还要防止弱引用的对象随时被释放而使用局部强引用。

__weak Class * weakSelf = self;
self.block = ^{
        Class * innerSelf = weakSelf;
        NSLog(@"%@", self.ob1);
};
不知理解了没有。。。
alfred321 2016-07-19
  • 打赏
  • 举报
回复
感觉是 self.ob1和self.block 死循环了. 小白一名,不太确定,请指正。
gx_wqm 2016-06-26
  • 打赏
  • 举报
回复
你的意思是:self拥有blcok,但是block并没拥有self,只是拥有了self的ob1, 但是self的ob1并不拥有block,所以根本没构成循环引用?
网易云捕 2016-06-22
  • 打赏
  • 举报
回复
这简单啊:block保留了BlockOb实例,BlockOb实例又没有指向block,哪里来的循环?
CodingFire 2016-06-22
  • 打赏
  • 举报
回复
__weak弱引用,使用一次后置nil,就不会再触发了。
gx_wqm 2016-06-12
  • 打赏
  • 举报
回复
你说的是对的,但是我想弄清楚没明白的: BlockOb *tempOb = self.ob1; self.block = ^{ NSLog(@"%@", tempOb); }; self和ob1能正常释放!这是为什么?
不担心 2016-06-12
  • 打赏
  • 举报
回复
我估计导致循环应用的并不是BlockOb,而是self __weak selfClass *wself=self; self.block = ^{ NSLog(@"%@", wself.ob1); }; 这样应该就不会了

29,031

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧