【发布时间】:2012-05-07 02:37:49
【问题描述】:
如果我将 malloc 与自动引用计数一起使用,是否仍需要手动释放内存?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
【问题讨论】:
标签: objective-c malloc automatic-ref-counting
如果我将 malloc 与自动引用计数一起使用,是否仍需要手动释放内存?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
【问题讨论】:
标签: objective-c malloc automatic-ref-counting
是的,您必须自己编写对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 的调用——不管怎样,你必须在你的代码中包含它。
【讨论】:
[obj release] - 这是它唯一的工作。只有当释放导致引用计数下降到零时,才会调用[obj dealloc]。
是的。 ARC 仅适用于 Objective-C 实例,不适用于 malloc() 和 free()。
【讨论】:
[ClassName alloc] 创建的 Objective-C 实例。
Vertex v; 不进行任何堆内存分配。作为一个局部变量,它将被分配到堆栈上,并在作用域退出时自动丢弃。作为另一个结构或对象的一部分,它将受包含对象的释放规则的约束。
int[100] 无论如何都不是free() 的有效参数,因为它将在堆栈上分配。
NSData 的一些“NoCopy”变体可以与对 malloc 的调用配对,这将使您不必释放任何东西。
NSMutableData 可以用作 calloc 的更高开销版本,它提供了 ARC 的便利性和安全性。
【讨论】:
在 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,如果是,则处理该错误?那么,不需要检查buf != NULL 是否在dealloc 中,对吧?另外,在dealloc 末尾设置buf = NULL 有什么意义?特别是,如果buf 是一个私有实例变量,那么在调用dealloc 之后,您是否必须在代码中做一些非常奇怪的事情才能访问buf?