目标c中原始C类型的内存管理

时间:2012-07-14 20:02:34

标签: objective-c memory-management primitive-types

如果我在程序中分配一个对象,那么我需要释放它。如果我创建一个int,那么我需要调用free(myint)还是在函数结束时自动销毁变量?另外,如果我将int,long或bool属性添加到我的对象中,那么我是否需要在dealloc中处理它们还是在我使用的函数完成后它们也会被销毁?

3 个答案:

答案 0 :(得分:4)

  

如果我创建一个int,那么我是否需要调用free(myint)或者在我的函数结束时自动销毁变量?

这取决于你是如何做到的:原始类型的自动变量在超出范围时被释放:

if (a == b) {
    int sum = 0;
    sum = a + b;
    NSLog(@"%d", sum);
}

如果您使用malloccalloc分配原语,则必须在最后使用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您创建的每个对象newalloccopy;或者在增加当前对象的retain计数器之后。

在其他每种情况下,您都不必担心调用release方法,而且不应该这样做,这会导致崩溃的风险很高。

(这只是没有ARC的内存管理的粗略基础)

你不需要担心原语,除非你之前使用alloc(...);malloc(...);为它们分配了内存;在这种情况下,在完成使用后必须free(...);分配的内存。