Block的retain cycle问题太恶心了! - OurCoders (我们程序员)

OC

Block的retain cycle问题太恶心了!

freecunix 发布于 2013年12月18日 | 更新于 2013年12月22日
无人欣赏。

比如:

ClassA* objA = [[[ClassA alloc] init] autorelease];
 objA.myBlock = ^{
 [self doSomething];
 };
 self.objA = objA;

就会导致self无法释放。。

只能 __weak MyClass* weakSelf = self;

然后objA.myBlock中: [weakSelf doSomething];

这种问题大家有什么经验避免吗??这个很难发现呀。

共21条回复
adad184 回复于 2013年12月18日

就是用weakSelf解决

hikui 回复于 2013年12月18日

没错,这个很难发现的。。。。只能遵守规则。而且有些地方该用回调的还是用回调的好。

另外,开了ARC之后,出现retain circle的地方会给出warning的。

freecunix 回复于 2013年12月18日

2楼 @hikui 这个开arc也没有警告呀,貌似。。

terryso 回复于 2013年12月18日

这个其实跟你用delegate时设置为retain一样。我觉得不是Block的设计恶心,是你不遵循规范而已。。。

nickel 回复于 2013年12月18日

4楼,我觉得嘛,这虽然确实是和delegate用retain的情况一样,但block的使用本来就是一种很"隐式"的模式,既然"隐式",那么很多东西就应该更自动得处理,这样使用者关注得就更少些。所以我认为这也算是objc在内存自动回收机制上的不完美,还是太需要用户关心内存管理关系了,只是少了自己去引用加减法。如果能够把strong/weak这些东西完全去除才比较完美。

所以我觉得oc里的ARC对于我来说还只算是半成品或者过渡品,只是减少了开发者一些基本工作,但远远离不需要关心内存管理还很远。

董一凡 回复于 2013年12月18日

解决方案就是:传递NSObject的时候一定要在心里过一遍谁拥有谁,千万别以为开了ARC就不用内存管理了,引用计数和自动GC是有本质区别的。

另一个解决方案就是学C++,所谓不会C++的Obj-C程序员不是一个好C程序员

nickel 回复于 2013年12月18日

对,6楼 说得是本质问题。我觉得很多人一开始用OC就是用ARC的开发者,尤其是没有c/c++基础的,很容易把ARC理解为GC。

freecunix 回复于 2013年12月18日

5楼 @nickel 同意,arc很多地方还不完善,而且规则过于复杂,虽然自己malloc/free很麻烦,但至少规则很明确,很简单,写malloc就要写free。 arc是帮你完成了一些,还有一些需要自己注意,至于什么地方要注意,就是个问题了。。。

freecunix 回复于 2013年12月18日

6楼 @董一凡

7楼 @nickel

恩,做oc的大部分都是c/c++出身吧?可能正因如此,用arc才容易出问题。 大家都习惯手动了。忽然不用管了,就蒙了。。

terryso 回复于 2013年12月18日

5楼 @nickel 我觉得要真正做到不需要管理内存,真的只有GC才能做到。ARC只是比较先进的智能指针而已。。。手工管理内存的基本技能还是需要的,尤其是在跟CoreFoundation之类的底层C代码打交道时。我建议一开始还是从手工管理内存开始练手,等练得差不多了,才转到ARC。而且用ARC时,首先要先了解ARC相关的坑,这个推荐看iOS与OS X多线程与内存管理那本书,里面的ARC以及BLOCK等都讲得非常透彻。

本帖有21个回复,因为您没有注册或者登录本站,所以,只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。

登录 或者 注册
发布新帖
相关帖子
相关新闻
最新帖子

AltStyle によって変換されたページ (->オリジナル) /