我最近一直在学习如何在iOS开发中使用Quartz API,并且已经注意到一些有点奇怪的事情。对于1,为什么我们必须在制作它们之后释放某些物体?另外,指针变量没有星号,为什么?像下面的代码:为什么我们在使用Quartz API时必须释放对象?
CGContextRef context = UIGraphicsGetCurrentContext();
在上面的例子中,变量上下文是一个指针。为什么我们不使用星号?感谢任何帮助/指导。请尽可能详尽,因为我喜欢深入了解我使用的技术。
我最近一直在学习如何在iOS开发中使用Quartz API,并且已经注意到一些有点奇怪的事情。对于1,为什么我们必须在制作它们之后释放某些物体?另外,指针变量没有星号,为什么?像下面的代码:为什么我们在使用Quartz API时必须释放对象?
CGContextRef context = UIGraphicsGetCurrentContext();
在上面的例子中,变量上下文是一个指针。为什么我们不使用星号?感谢任何帮助/指导。请尽可能详尽,因为我喜欢深入了解我使用的技术。
您正在处理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分配的内存。
我只想发表评论,因为我现在没有时间深入解答。简单的答案是您正在处理C级API(未写入或封装在Objective-C中)。 CGContextRef是一个指向结构体的指针的typedef(C没有类,但是结构体是一个容器类型)。看一下CGContext.h中'CGContextRef'的定义,你会看到那里使用的星号语法。自动引用计数(ARC)是一种编译器功能,只能在Obj-C对象上运行,因此必须明确释放由此C及其他C级API分配的内存。 – Mathew
@Mathew谢谢!我也很好奇开发人员是否倾向于使用这个功能,而不是说在设计用于应用程序的UI图形时在Sketch等软件中创建图像?我是新用户界面图形的东西。 – Vimzy
@Mathew如果你想,只需复制/粘贴你的评论作为答案,我会选择它作为最佳答案。 – Vimzy