ios – 当使用objective-c块时,避免泄漏的最佳做法是什么?

我已经和块一起工作了一段时间,我想知道所有泄漏的可能情况.我已经阅读了很多关于“保留循环循环”,但我认为也许还有其他可能的情况.另外,我在想一些简单的例子,如:如果你在块内调用块,怎么办?如果我们使用ARC不同,块内存管理是不同的?如何找到一个块是否用仪器(或其他一些工具)泄漏记忆?

解决方法

简短的答案:块不会固有地引入任何特殊的泄漏问题(在特殊情况下保留循环,如下所述).

长的答案:几个想法:

>除保留周期(也称为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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...