2015-08-20 27 views
0

我最近一直在学习如何在iOS开发中使用Quartz API,并且已经注意到一些有点奇怪的事情。对于1,为什么我们必须在制作它们之后释放某些物体?另外,指针变量没有星号,为什么?像下面的代码:为什么我们在使用Quartz API时必须释放对象?

CGContextRef context = UIGraphicsGetCurrentContext(); 

在上面的例子中,变量上下文是一个指针。为什么我们不使用星号?感谢任何帮助/指导。请尽可能详尽,因为我喜欢深入了解我使用的技术。

+4

我只想发表评论,因为我现在没有时间深入解答。简单的答案是您正在处理C级API(未写入或封装在Objective-C中)。 CGContextRef是一个指向结构体的指针的typedef(C没有类,但是结构体是一个容器类型)。看一下CGContext.h中'CGContextRef'的定义,你会看到那里使用的星号语法。自动引用计数(ARC)是一种编译器功能,只能在Obj-C对象上运行,因此必须明确释放由此C及其他C级API分配的内存。 – Mathew

+0

@Mathew谢谢!我也很好奇开发人员是否倾向于使用这个功能,而不是说在设计用于应用程序的UI图形时在Sketch等软件中创建图像?我是新用户界面图形的东西。 – Vimzy

+0

@Mathew如果你想,只需复制/粘贴你的评论作为答案,我会选择它作为最佳答案。 – Vimzy

回答

1

您正在处理C级API(未写入或封装在Objective-C中)。 CGContextRef是指向struct(C没有类,但structs是容器类型)的指针的typedef。看看的定义CGContext.h,你会看到在那里使用的星号语法。

有一个主要原因,我可以想到为什么苹果会定义CGContextRef,而不是让程序员直接使用指向CGContext结构体的指针。在Objective-C中,你总是使用指针。你永远不会使用静态分配的Objective-C类实例 - 事实上,编译器禁止它。然而,在C中,这不是事实。 Apple希望将所有对CGContext结构体的引用保留为指针,以便引用计数按预期工作,并且可以保证您使用的对象与他们提供的对象相同。注意:引用计数本身并不是C语言的一部分,它是Apple写入CGContext这样的结构的东西,允许用它们进行编程,使其感觉类似于使用Objective-C对象进行编程。考虑下面的代码片段作为我正在谈论的简要例子。

在C(你可以编译这个作为一个Objective-C程序的一部分):

typedef struct {int a; int b; int refCount;} SimpleObject; 

SimpleObject *obj1 = malloc(sizeof(SimpleObject)); 
obj1->a = 5; 
obj1->b = 6; 
obj1->refCount = 1; 

SimpleObject *obj2 = obj1; 

NSLog(@"test: (%d, %d) (%d, %d) (%d, %d)", obj1->a, obj2->a, obj1->b, obj2->b, obj1->refCount, obj2->refCount); 
NSLog(@"test: %d", obj1 == obj2); //they are literally the same object (same location in memory) 

SimpleObject obj3 = *obj1; 

NSLog(@"test: (%d, %d) (%d, %d) (%d, %d)", obj1->a, obj3.a, obj1->b, obj3.b, obj1->refCount, obj3.refCount); 
NSLog(@"test: %d", obj1 == &obj3); //they are not the same object (same location in memory) 

obj1->refCount--; 

NSLog(@"test: how many retains on obj1? %d how about obj2? %d and obj3? %d", obj1->refCount, obj2->refCount, obj3.refCount); 

free(obj1); 

尝试在Objective-C类似的东西,编译器很快抛出一个错误:

NSObject *obj1 = [[NSObject alloc] init]; 

NSObject *obj2 = obj1; 

NSLog(@"test: %d", obj1 == obj2); // they are literally the same object (same location in memory) 

NSObject obj3 = obj1; // compiler error 

自动引用计数(ARC)允许您在Objective-C中分配内存,然后不用担心后续释放或释放内存。这是一个编译器功能,只能在Obj-C对象上运行,因此必须明确释放由此C及其他C级API分配的内存。

相关问题