malloc + 自动引用计数?

10

如果我在使用自动引用计数(ARC)时使用malloc,那么我是否仍然需要手动释放内存?

int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
4个回答

21

是的,您必须自己编写调用 free 的代码。但是,如果将指针放入引用计数对象的实例中,则该指针可能间接参与引用计数系统:

@interface MyObj : NSObject {
    int *buf;
}
@end

@implementation MyObj

-(id)init {
    self = [super init];
    if (self) {
        buf = malloc(100*sizeof(int));
    }
}
-(void)dealloc {
    free(buf);
}

@end

无论如何,你都必须在代码中调用 free 函数,这是不可避免的。


1
那么当ARC移除实例时,它会调用dealloc吗? - Stas Jaro
2
@stas 嗯,不是直接的:ARC 会调用 [obj release] - 这是它唯一的工作。只有当释放导致引用计数降至零时,才会调用 [obj dealloc] - Sergey Kalinichenko

4

是的,ARC仅适用于Objective-C实例,不适用于malloc()free()


1
不。ARC 只处理使用 [ClassName alloc] 创建的 Objective-C 实例。 - Greg Hewgill
抱歉,您能告诉我由“Vertex v;”创建的结构体是否算作Objective-C实例吗? - Stas Jaro
1
不,Vertex v; 不会进行任何堆内存分配。作为局部变量,它将在堆栈上分配,并在作用域退出时自动丢弃。作为另一个结构或对象的一部分,它将受到包含对象的释放规则的影响。 - Greg Hewgill
stas: int[100] 不会是 free() 的有效参数,因为它是在栈上分配的。 - Victor Zamanian

1
一些“NoCopy”变体的NSData可以与调用malloc配对使用,这将使您免于释放任何内容。 NSMutableData可用作稍微高开销的calloc版本,提供ARC的便利和安全性。

0
在dealloc中添加一个if not nil语句,并将其赋值为nil以确保安全。不想释放nil,malloc可能在init之外使用等。
@interface MyObj : NSObject {
    int *buf;
}
@end

@implementation MyObj

-(id)init {
    self = [super init];
    if (self) {
        buf = malloc(100*sizeof(int));
    }
}

-(void)dealloc {
    if(buf != null) {
        free(buf);
        buf = null;
    }
}

@end

我不明白为什么在dealloc中要检查buf != NULL。难道你不应该在init中的malloc之后检查buf == NULL,如果是,则处理该错误吗?那么,在dealloc中就没有必要检查buf != NULL了,对吧?此外,在dealloc的末尾设置buf = NULL有什么意义呢?特别是,如果buf是一个私有实例变量,那么在调用dealloc之后访问buf不是很奇怪吗? - ma11hew28
你是对的。if语句的唯一原因是为了避免调用free(null)以避免崩溃。只是测试过了,free(null)不会导致崩溃。 - Gary Davies

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接