如果我在程序中分配一个对象,那么我需要释放它。如果我创建一个int,那么我需要调用free(myint)还是在函数结束时自动销毁变量?另外,如果我将int,long或bool属性添加到我的对象中,那么我是否需要在dealloc中处理它们还是在我使用的函数完成后它们也会被销毁?
答案 0 :(得分:4)
如果我创建一个int,那么我是否需要调用free(myint)或者在我的函数结束时自动销毁变量?
这取决于你是如何做到的:原始类型的自动变量在超出范围时被释放:
if (a == b) {
int sum = 0;
sum = a + b;
NSLog(@"%d", sum);
}
如果您使用malloc
或calloc
分配原语,则必须在最后使用free
(我不知道您为什么要使用这样的原语,不过):
if (a == b) {
int *sumPtr = malloc(sizeof(int));
*sumPtr = a + b;
NSLog(@"%d", *sumPtr);
free(sumPtr);
}
向对象添加基本字段时遵循相同的规则:如果在malloc
中使用init
,则必须在free
中使用dealloc
。否则,该值将与对象的其余部分“在线”分配,并且不需要单独的释放。
答案 1 :(得分:3)
作为C的超集,自动堆栈变量的规则是相同的。因此,在函数中定义int x;
意味着您不必执行任何操作来清理它,因为它位于堆栈中。诸如int *x = malloc(...);
之类的堆分配在某些时候需要free(x);
来清理。如果这些步骤发生在一个对象内(例如在init
中),那么它的想法是一样的;可以保留int
字段,但需要通过类的dealloc
方法中的释放来平衡分配。
答案 2 :(得分:0)
内存管理的基本关键点(没有任何更深入的细节),您必须release
您创建的每个对象new
,alloc
或copy
;或者在增加当前对象的retain
计数器之后。
在其他每种情况下,您都不必担心调用release
方法,而且不应该这样做,这会导致崩溃的风险很高。
(这只是没有ARC的内存管理的粗略基础)
你不需要担心原语,除非你之前使用alloc(...);
或malloc(...);
为它们分配了内存;在这种情况下,在完成使用后必须free(...);
分配的内存。