我已经编程了2个月(所以我很新)我正在学习如何为iphone应用程序绘制图形,但我需要澄清CGContext
。
要创建当前上下文,我们使用CGContextRef currentContext=UIGraphicsGetCurrentContext()
,如果我理解得很好(如果我错了请纠正我),UIGraphicsGetCurrentContext()
创建当前上下文但我们将其分配给类型{{的指针1}}。
当前上下文是堆上的对象分配内存还是只是堆栈上的一种变量?我知道我们使用指针来处理相同的数据并避免复制大内存块(对吧?)
但是真正的CGContexRef
,对象,结构还是其他什么?
答案 0 :(得分:1)
简答:CGContextRef
是指向CGContext
的指针,它是一个结构。
CGContext
在技术上是一个结构,但它在概念上是一个对象,但在C中,而不是Objective-C。核心框架是面向对象的C框架。
另外,@ dandan78的建议很有助于找出事情的内容。
答案 1 :(得分:1)
这是一个伪装成不透明C指针的对象。如果你将它转换为id,它将表现得像任何其他对象(它不需要在ARC下显式保留/释放,可以添加到集合等)。 CGContext API要求将其转换为CGContextRef。
所有Core Foundation SomethingRef
类型都是如此。有些像CFArray可以安全地转换为等效的Cocoa类型(如NSArray)。一般来说,它没那么有用。当人们仍然使用Carbon时,它使人们更容易将旧的基于碳的代码迁移回Cocoa。
值得记住,您可以在调试器中对CFType执行po
。
答案 2 :(得分:0)
这些不透明类型的要点是您不需要知道并且不需要关心。 Apple可以在每次发布时改变其内部结构,我们不会知道(并且不需要)。通常,FooRef
类型是指向某事物的指针。现在,它被定义为:
typedef struct CGContext *CGContextRef;
但struct CGContext
看起来像什么,我们不知道。它看起来像它真的是一个CoreFoundation(也许是Objective-C)对象,因为它有通常的保留/释放功能:
CGContextRef CGContextRetain (CGContextRef c);
void CGContextRelease (CGContextRef c);
通常的CoreFoundation内存命名模式适用:您不需要发布CGContextRef
,除非它由包含单词Create
或Copy
的函数返回。 / p>