【问题标题】:Memory leaks in Xcode 4.2 and iOS 5Xcode 4.2 和 iOS 5 中的内存泄漏
【发布时间】:2012-01-07 04:09:51
【问题描述】:
我使用 xcode 4.2,这个使用 ARC(自动引用计数)。
这不是内存泄漏,因为 ARC 发送“释放”消息:
NSNumber *xy = [[NSNumber alloc] init];
但有可能会造成内存泄漏:
char *oldString = "Old String";
char newStrig = strdup(oldString);
我想知道其他类型的内存泄漏可以吗?
(如果可以不使用 C 或 C++)
【问题讨论】:
标签:
objective-c
memory-leaks
xcode4.2
【解决方案1】:
ARC 仅适用于 Cocoa 内存管理。如果您在 Cocoa 和 CoreFoundation 之间进行转换以获得免费桥对象,则可以使用宏来传输内存管理。
您可以在 C 中泄漏内存,您可以泄漏 Core Foundation 内存,而静态分析器可以帮助找到这些。
ARC 并没有完全取消内存管理。它消除了为 Cocoa 对象管理内存的需要,并且在某些情况下(因为它可以优化掉一些 retainrelease 调用)在管理内存方面更有效,但您仍然需要了解 Core Foundation 对象的内存管理,并且用于 C 内存。
您还需要了解 Cocoa 内存管理以了解何时使用 strong、weak 或 copy 属性,以及何时在块上使用 Block_copy() 和 Block_release(),即使块是 Cocoa 对象在大多数情况下,ARC 会为您处理正确的内存管理。
再次; ARC 不会取消内存管理。它简化了它,并减少了您必须编写的代码量,但您仍然需要了解幕后为您做了什么,以及何时需要管理自己的内存。
【解决方案2】:
ARC 只能在您使用 Objective-C 内存分配的情况下工作,因为它专门与此相关联。事实上,当您使用 ARC 时,编译器会尽最大努力将每个分配与一个版本匹配(它甚至不能保证这一点)。
如果您使用除 Objective-C 分配之外的任何其他方式,那么您又要靠自己了。 ARC 无法处理。