objective-c 内存管理--对象保证存在多长时间?

标签 objective-c memory-management garbage-collection automatic-ref-counting

我有以下形式的 ARC 代码:

NSMutableData* someData = [NSMutableData dataWithLength:123]; ...

CTRunGetGlyphs(run, CGRangeMake(0, 0), someData.mutableBytes); ...

const CGGlyph *glyphs = [someData mutableBytes]; ...

...后跟从 glyphs 读取内存但不对 someData 执行任何操作的代码,它不再被引用。请注意,CGGlyph 不是对象类型,而是无符号整数。

我是否需要担心 someData 中的内存可能会在我完成 glyphs 之前被释放(实际上只是指向 someData)?

所有这些代码都在同一范围内(即,单个选择器),glyphssomeData 同时超出范围。

PS 在这个问题的早期草稿中,我提到了“垃圾收集”,它并不真正适用于我的项目。这就是为什么下面的一些答案将其与 ARC 下发生的事情同等对待。

最佳答案

无论您是使用 GC 还是其他人推荐的 ARC,您都可能遇到麻烦。您正在处理的是一个内部指针,它通常在 GC 或 ARC 中不被视为拥有引用 - 除非实现具有特殊的 NSData。如果没有该拥有引用,GC 或 ARC 可能会删除该对象。您遇到的问题是内部指针所特有的。

当您描述您的情况时,最安全的做法是坚持使用真实的引用资料。您可以通过将 NSData 引用分配给实例变量或 static(如果您愿意,可以使用本地方法)变量,然后分配 nil 来完成此操作完成内部指针后,指向该变量。在 static 的情况下要注意并发性!

在实践中,您的代码可能会在 GC 和 ARC 中工作,可能更可能在 ARC 中工作,但可以想象,任何一个都可能会影响您,尤其是当编译器发生变化时。对于一个变量声明和一项额外赋值的成本,您可以避免这个问题,便宜的保险。

[参见 this讨论作为 ARC 下短生命周期的例子。]

关于objective-c 内存管理--对象保证存在多长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12430305/

相关文章:

objective-c - 返回 C 结构数组

ios - 智能排序 Localized.strings 文件

c - 如何在保留虚拟地址范围的同时释放内存?

.net - Funq和处理子容器

java - 什么是有助于 Java GC 的良好 Java 编码实践?

objective-c - 从粘贴板上的 NSURL 获取路径

ios - 通过 ViewControllers 传递数据 - 进行设置页面

ios - 如何查找并修复崩溃原因

iphone - 内存管理困境, Objective-C

c# - 数组或迭代器 - 对于返回一个/两个元素的调用具有更好的性能特征(内存方面)