我没有看到任何问题。
自动释放仅适用于Objective-C对象。它基本上通过将对象放入自动释放池中来延迟实际的释放调用,该自动释放池在主运行循环的每次迭代之后刷新,在池中的每个对象上调用-release。从方法返回的对象通常是自动释放的,尽管ARC有一种机制,通常可以通过确定调用者只需要该值来避免实际池的开销,并且可以跟踪引用并在那里调用-release。在ARC模式下,编译器会在需要autorelease vs release时为您计算,并且不允许您自己调用这些方法。
大多数情况下,您不需要自己的自动释放池,但如果您在循环中执行某些操作,每次迭代都可以创建大量临时对象,则可能需要为每个循环迭代使用autorelease_pool,以便不会构建内存每次都要清理,所以下一次迭代可以重新使用那个内存。如果您正在编写命令行程序或其他没有自己的Objective-C支持的工具,那么是的,您至少需要在入口点附近有一个自动释放池。
使用malloc / free的C堆内存超出了自动释放概念(仅适用于NSObject的保留/释放机制)。对于每个malloc(),一旦不再需要,你需要最终在该内存上调用free(),否则就是泄漏。上面的代码是正确的 - 有一个malloc(),然后在返回nil时调用free(),或调用initWithBytesNoCopy:方法(这是一个使用传入的字节作为实际NSData的特殊方法存储,避免内存复制和进一步内部malloc的开销,然后在释放对象本身时调用free())。
initWithBytesNoCopy:length:只调用-initWithBytesNoCopy:length:freeWhenDone:freeWhenDone的YES参数,基本上是根据其文档。你可以明确地调用更长的方法,如果你认为它使它更具可读性(因为它更清楚地表明你知道自由行为),但它将以相同的方式工作。
NSData加密方法实际上不会创建除您要返回的对象之外的任何对象 - 它的所有代码都是更直接的C代码。所以自动释放池对任何事都没有帮助。 NSString加密方法确实创建了一些临时对象,因此如果加密的内存量很大,那么自动释放池可能会有所帮助,如果你有后续的重要工作(但一定要对外面返回的对象有强引用)池范围)。实际上,ARC很可能会找出大多数这些对象的临时性质,并且无论如何都比自动释放池更有效地处理它们。
如果您可以使用Instruments对代码进行概要分析,则可以在程序运行时查看程序的内存使用情况,并且只会出现使用本地自动释放池时会考虑的高峰值的地方。