解决方法
长的答案:几个想法:
>除保留周期(也称为ARC中的强参考周期),如果您未通过Avoid Strong Reference Cycles when Capturing self),确实没有与块相关的其他特殊泄漏风险.如果你记得这些块对它们引用的对象有很强的引用,那么只需遵循标准basic rules of memory management.
如Use Lifetime Qualifiers to Avoid Strong Reference Cycles所述,在MRC中,您可以使用__block限定符来解决这些强引用周期,但在ARC中,可以使用__weak限定符.
>如果你把块放在块中,那么它不会引入任何额外的泄漏风险(除非你制作一些引用强参考循环的循环引用,否则这些引用通常不太可能在块内执行).
>块保留其引用的对象(除非对象是合格的,例如在MRC中使用__block或在ARC中使用__weak).一个使用块的事实与代码是否泄漏无关.这是您选择ARC v MRC的功能,以及您是否避免了保留周期,如果执行MRC,是否包括必要的发布语句.
>在发现泄漏方面,标准工具都能正常工作:
>特别是如果做非ARC代码,静态分析器(shift命令B或从“产品”菜单中选择“分析”)是非常有用的.
>“仪器用户指南”中的Finding Leaks in Your App讨论.
>有时对于很强的参考周期,它不会总是被仪器中的泄漏工具标记.在这一点上,在“仪器”中使用“分配”工具有时是有用的,突出显示您怀疑应该已被释放但未被释放的一些分配,并且会显示分配的内存.见iOS app with ARC,find who is owner of an object
>如果您想知道某些对象是否被正确地释放,将诊断的dealloc实现添加到应该被释放的对象中是有用的:
- (void)dealloc { NSLog(@"%s",__FUNCTION__); // if non-ARC,remember to include the following line,too: // // [super dealloc]; }
这样,当对象被释放时,您将在控制台上看到一条消息.
>如果您担心泄漏,使用ARC(IMHO)是消除许多平凡漏洞的最简单的方法之一.在非ARC代码中,使用简单的省略释放或自动释放(非常容易,以上链接将帮助您找到它们)非常容易泄漏.因为一个简单的“哦,我忘了释放”,在ARC中更难泄漏.
参考
> Blocks Programming Topics
> Working with Blocks编程与Objective-C指南
> Advanced Memory Management Guide
> Transitioning to ARC Release Notes