gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:58:55 26 4
gpt4 key购买 nike

我有以下形式的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com