gpt4 book ai didi

objective-c - 核心基础对象和保留/释放消息

转载 作者:行者123 更新时间:2023-12-03 16:24:04 26 4
gpt4 key购买 nike

假设我们有一些 Core Foundation 对象,例如 CGColorRef ,添加到 NSArray像这样:

CGColorRef color = ...;
NSArray *array = [NSArray arrayWithObject:(id)color];

由于数组保留其内容,color收到 retain消息(不是 CFRetain() ,对吧?)。从内存管理的角度来看,这种情况会发生什么?

最佳答案

From Core Foundation Design Concepts :

Note from the example that the memory management functions and methods are also interchangeable—you can use CFRelease with a Cocoa object and release and autorelease with a Core Foundation object.

它没有特别提到retain,但实际上,它也有效,就像copy(各种类的CFFooCreateCopy )和描述(CFCopyDescription)。最后一个是在使用 NSLog 和其他字符串格式化函数和方法时如何将 CF 对象作为 %@ 格式化规范的值传递。

结果是一样的:retainCFRetain 相同,releaseCFRelease 相同等

需要注意的一些事项:

  • 在 iOS 7 和 OS X 10.9 之前,没有与 NSObject 的 autorelease 方法对应的 CF 函数。 (7 和 10.9 引入了 CFAutorelease 函数。)如果您不使用 ARC,那么,如上面引用的文档中所述,您可以将 autorelease 发送到 CF 对象,并且它的工作方式与 NSObject 相同。
  • 您可以向 nil 发送消息,但不能在 NULL 上调用 CF 函数(您会崩溃)。 Quartz 有一些特定于类的函数,例如 CGContextRetain/Release,其中包括 NULL 检查;无论您想使用这些还是始终执行自己的 NULL 检查,这都是风格问题。
  • CF 的保留和释放函数在垃圾回收下工作,而 retainrelease 消息是无操作的(就像发送到 nil) 。除非您正在开发 GC 的 Mac 应用,否则这并不重要,在这种情况下,您需要在 CF 对象上使用 CFRetainCFRelease
  • 同样,在 ARC 下,retainrelease 消息将是非法的,并且 CF 对象不会自动进行引用计数。您需要在 CF 对象上使用 CFRetainCFRelease
  • 正如记录的那样,集合总是做正确的事情。通常,这意味着强引用。在 GC 之外,这意味着集合(数组、字典等)将保留和释放其对象,无论是自动(通过分配,如果其代码是 ARCified)还是手动(通过显式 retain发布消息)。

关于objective-c - 核心基础对象和保留/释放消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7589384/

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