参考CGPointMake explaination needed?
如果我错了,请纠正我,在CGPointMake
的实现中,CGPoint p;
声明一个struct
的局部变量,应该在离开范围后释放。但为什么函数可以没有风险地返回值?
无论如何,假设CGPointMake
的实现是正确的,我应该释放由CGPointMake
创建的CGPoint吗?
答案 0 :(得分:7)
它不需要被释放,因为它永远不会存在于堆上。只需要释放堆分配的内存。在方法/函数存在后,将自动清除堆栈中分配的内存(如CGPointMake()
中所做的那样)。
该函数可以返回一个点,因为编译器看到“啊哈,这个函数想要返回一个结构,sizeof(CGPoint)
字节大,所以我要确保返回值内存槽中有足够的空间对于那些大事。“然后,当函数退出时,返回值被复制到返回内存插槽中,函数退出,并且返回槽中的值被复制到其新目标。
答案 1 :(得分:0)
该函数可以返回CGPoint
,因为该结构“足够小”,无法直接从函数返回。你没有返回指针,你直接返回整个事物。与将CGPoints
作为参数的方法相同 - 您可以直接按值传递整个事物。
正如戴夫所说,CGPoints不是对象,它们只是结构。 CGPointMake
没有“分配”内存。它只是一个函数,它返回一个具有正确大小的结构,然后你通常会在自己的堆栈中捕获到本地或传递或者其他任何东西。
与任何其他基本类型(int,float或其他结构)一样,当它超出范围时不需要释放它。
(注意:许多架构/编译器/“应用程序二进制接口”对于用作参数或返回值的事物的大小有优化和大小限制。在这种情况下,CGPoint实际上可以完全适合一个64-位寄存器(2x 32位浮点数)使得它不会比返回int更重要。但编译器也可以做其他技巧,例如复制进出更大的结构,例如CGRect。)