关于CGPoint的内存管理

时间:2010-09-17 01:52:12

标签: iphone memory-management cgpoint

参考CGPointMake explaination needed?

如果我错了,请纠正我,在CGPointMake的实现中,CGPoint p;声明一个struct的局部变量,应该在离开范围后释放。但为什么函数可以没有风险地返回值?

无论如何,假设CGPointMake的实现是正确的,我应该释放由CGPointMake创建的CGPoint吗?

2 个答案:

答案 0 :(得分:7)

它不需要被释放,因为它永远不会存在于堆上。只需要释放堆分配的内存。在方法/函数存在后,将自动清除堆栈中分配的内存(如CGPointMake()中所做的那样)。

该函数可以返回一个点,因为编译器看到“啊哈,这个函数想要返回一个结构,sizeof(CGPoint)字节大,所以我要确保返回值内存槽中有足够的空间对于那些大事。“然后,当函数退出时,返回值被复制到返回内存插槽中,函数退出,并且返回槽中的值被复制到其新目标。

答案 1 :(得分:0)

该函数可以返回CGPoint,因为该结构“足够小”,无法直接从函数返回。你没有返回指针,你直接返回整个事物。与将CGPoints作为参数的方法相同 - 您可以直接按值传递整个事物。

正如戴夫所说,CGPoints不是对象,它们只是结构。 CGPointMake没有“分配”内存。它只是一个函数,它返回一个具有正确大小的结构,然后你通常会在自己的堆栈中捕获到本地或传递或者其他任何东西。

与任何其他基本类型(int,float或其他结构)一样,当它超出范围时不需要释放它。

(注意:许多架构/编译器/“应用程序二进制接口”对于用作参数或返回值的事物的大小有优化和大小限制。在这种情况下,CGPoint实际上可以完全适合一个64-位寄存器(2x 32位浮点数)使得它不会比返回int更重要。但编译器也可以做其他技巧,例如复制进出更大的结构,例如CGRect。)