CGContext是一个对象吗?

时间:2014-04-24 07:10:16

标签: objective-c cgcontext

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

3 个答案:

答案 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,除非它由包含单词CreateCopy的函数返回。 / p>