目标 c - CGContext 是一个对象



我已经编程了 2 个月(所以我是个新手(,我目前正在学习如何为 iPhone 应用程序绘制图形,但我需要澄清CGContext。要创建当前上下文,我们使用 CGContextRef currentContext=UIGraphicsGetCurrentContext() ,如果我理解得很好(如果我错了,请纠正我(,UIGraphicsGetCurrentContext()创建当前上下文,但我们将其分配给类型 CGContexRef 的指针。当前上下文是在堆上分配内存的对象,还是只是堆栈上的一种变量?我知道我们使用指针来处理相同的数据并避免复制大内存块(对吗?但是什么是真正的CGContext,对象,结构或其他东西?

简短回答:CGContextRef是一个指向CGContext的指针,它是一个结构体。

CGContext在技术上是一个结构体,但它在概念上是一个对象,但在 C 中,而不是 Objective-C。核心框架是面向对象的C框架。

此外,@dandan78的建议有助于找出事情是什么。

它是一个伪装成不透明 C 指针的对象。如果你把它投射到 id,它的行为将像任何其他对象一样(它不需要在 ARC 下显式保留/释放,可以添加到集合中等(。不过,CGContext API 要求将其转换为 CGContextRef。

所有核心基础SomethingRef类型也是如此。有些,如CFArray可以安全地转换为等效的可可类型(如NSArray(。一般来说,它不是那么有用。当人们仍在使用Carbon时,它使人们更容易将旧的基于Carbon的代码迁移到Cocoa。

值得记住的是,您可以在调试器中的 CFType 上执行po

这些不透明类型的要点是你不需要知道,也不需要关心。苹果可以在每个版本中更改其内部结构,我们不知道(也不需要(。通常,FooRef类型是指向某事的指针。现在,它被定义为:

typedef struct CGContext *CGContextRef;

但是struct CGContext是什么样子的,我们不知道。看起来它实际上是一个CoreFoundation(也许是Objective-C(对象,因为有通常的保留/释放功能:

CGContextRef CGContextRetain (CGContextRef c);
void CGContextRelease (CGContextRef c);

通常的 CoreFoundation 内存命名模式适用:您不需要释放CGContextRef,除非它是由包含单词 CreateCopy 的函数返回的。

最新更新