如果我在使用自动引用计数(ARC)时使用malloc,那么我是否仍然需要手动释放内存?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
如果我在使用自动引用计数(ARC)时使用malloc,那么我是否仍然需要手动释放内存?
int a[100];
int *b = malloc(sizeof(int) * 100);
free(b);
是的,您必须自己编写调用 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
函数,这是不可避免的。
是的,ARC仅适用于Objective-C实例,不适用于malloc()
和free()
。
[ClassName alloc]
创建的 Objective-C 实例。 - Greg HewgillVertex v;
不会进行任何堆内存分配。作为局部变量,它将在堆栈上分配,并在作用域退出时自动丢弃。作为另一个结构或对象的一部分,它将受到包含对象的释放规则的影响。 - Greg Hewgillint[100]
不会是 free()
的有效参数,因为它是在栈上分配的。 - Victor Zamanian@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
[obj release]
- 这是它唯一的工作。只有当释放导致引用计数降至零时,才会调用[obj dealloc]
。 - Sergey Kalinichenko